如何在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_开头的列,返回一个单行tibbleunlist():将单行tibble转为普通向量,确保能和M拼接成函数所需的输入向量
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

