基于列名匹配生成新列:优化cur_data()低效问题并适配pick()
解决方案
方法一:矩阵索引法(高效向量化,首选)
这种方法完全不用rowwise,靠矩阵索引直接提取对应值,效率拉满,适合大数据集:
df <- data.frame(time=c("M0","M12","M0","M0","M12"), M0=c(1,2,4,5,1), M12=c(8,5,9,2,1)) # 生成新列newd df$newd <- df[cbind(seq_len(nrow(df)), match(df$time, colnames(df)))] # 查看结果 df
运行结果:
time M0 M12 newd 1 M0 1 8 1 2 M12 2 5 5 3 M0 4 9 4 4 M0 5 2 5 5 M12 1 1 1
方法二:tidyverse风格(替代cur_data,用pick/符号引用)
如果习惯用dplyr的链式操作,可以用pick()替代弃用的cur_data(),或者直接用符号引用,两种写法都可以:
写法1:用pick()
library(dplyr) df2 <- df %>% rowwise() %>% mutate(newd = pick(all_of(time)) %>% pull()) %>% ungroup() df2
写法2:用sym()符号引用
df2 <- df %>% rowwise() %>% mutate(newd = !!sym(time)) %>% ungroup() df2
两种写法的结果和你原来的一致,但pick()是当前推荐的函数,没有弃用问题。不过注意rowwise()本身还是逐行处理,大数据集下效率不如矩阵索引法。
内容的提问来源于stack exchange,提问作者BPeif
相关产品推荐
相关产品推荐

