You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在dplyr rowwise场景中结合starts_with()与lambda函数?

在dplyr rowwise场景下正确使用starts_with()的方法

问题背景

初始数据与加载包:

library(dplyr)
library(tidyr)
dat = data.frame('A' = 1:3, 'C_1' = 1:3, 'C_2' = 1:3, 'M' = 1:3)

直接指定列名的代码可正常运行:

dat %>% rowwise %>% mutate(Anew = list({function(x) c(x[1]^2, x[2] + 5, x[3] + 1)}(c(M, C_1, C_2)))) %>% ungroup %>% unnest_wider(Anew, names_sep = "")

但尝试用dplyr::starts_with()匹配列名时,以下代码无法运行:

dat %>% rowwise %>% mutate(Anew = list({function(x) c(x[1]^2, x[2] + 5, x[3] + 1)}(c(M, starts_with('C_'))))) %>% ungroup %>% unnest_wider(Anew, names_sep = "")

解决方案

starts_with()是列选择工具,不能直接在c()中拼接使用。需要借助dplyr::pick()选中目标列,再将其转为行内向量后传入函数。

修正后的代码

dat %>%
  rowwise() %>%
  mutate(
    Anew = list(
      {function(x) c(x[1]^2, x[2] + 5, x[3] + 1)}(
        c(M, pick(starts_with('C_')) %>% unlist())
      )
    )
  ) %>%
  ungroup() %>%
  unnest_wider(Anew, names_sep = "")

更易读的写法

先定义自定义函数,再调用:

my_fun <- function(x) {
  c(x[1]^2, x[2] + 5, x[3] + 1)
}

dat %>%
  rowwise() %>%
  mutate(Anew = list(my_fun(c(M, unlist(pick(starts_with('C_'))))))) %>%
  ungroup() %>%
  unnest_wider(Anew, names_sep = "")

原理说明

  • pick(starts_with('C_')):在rowwise环境下,选中当前行中所有以C_开头的列,返回一个单行tibble
  • unlist():将单行tibble转为普通向量,确保能和M拼接成函数所需的输入向量

内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:55:21