R语言如何提取另一列值指定列名的列对应数据
R逐行提取列名对应值的实现方案
优先推荐:tidyverse框架实现
首先加载包并构造示例测试数据:
library(tidyverse) # 示例数据 df <- tibble( colA = c("colB", "colD"), colB = c(1, 4), colC = c(2, 5), colD = c(3, 6) )
写法1:高可读性版本(适合小数据量)
用rowwise()行式操作配合cur_data()取当前行数据,逻辑直白不容易写错,十万行以内数据用这个足够:
df_res <- df %>% rowwise() %>% mutate(new_col = cur_data()[[colA]]) %>% ungroup()
运行结果符合预期:第一行new_col取值为1,第二行取值为6。
写法2:高性能版本(适合大数据量)
用R原生矩阵索引的逻辑实现,避免行式循环的性能损耗,百万行级数据也能秒出结果,用dplyr新语法pick()选取列,兼容性更好:
df_res <- df %>% mutate( col_index = match(colA, names(.)), new_col = as.matrix(pick(everything()))[cbind(row_number(), col_index)] ) %>% select(-col_index)
其他可选方案:base R原生实现
不需要加载任何第三方包,性能和上面的高性能tidyverse版本一致,逻辑也是矩阵索引:
df$new_col <- df[cbind(seq_len(nrow(df)), match(df$colA, names(df)))]
注意事项
- 如果
colA中存储的列名不存在于当前数据框,match会自动返回NA,对应位置的新列值也为NA,不会直接报错中断,适配有脏数据的场景 - 小数据量优先选高可读性的rowwise写法,代码维护成本低;数据量超过十万行优先选矩阵索引的方案,运行速度差距会非常明显
内容的提问来源于stack exchange,提问作者stats_model
相关产品推荐
相关产品推荐

