Dplyr如何按行匹配多列中指定序号列的对应值?
dplyr 按行提取指定序号列值的实现方法
方法1:行式操作(逻辑直观,适合小数据量)
dplyr 1.0.0及以上版本可以用rowwise() + c_across()的组合实现,代码如下:
# 加载依赖包 library(dplyr) library(purrr) # 方法2需要用到 # 构造示例数据 df <- tibble( Col_1 = c("a1", "b1", "c1"), Col_8 = c("a8", "b8", "c8"), Col_14 = c("a14", "b14", "c14"), Col_n = c("an", "bn", "cn"), 列序号 = c(14, 8, 1) ) # 实现提取 df_res <- df %>% rowwise() %>% # 选中所有要提取的目标列,按序号顺序排列,这里用starts_with匹配前缀,也可以手动指定列顺序 mutate(Value = c_across(starts_with("Col_"))[[列序号]]) %>% ungroup() # 取消行分组,避免后续操作受影响
方法2:向量化操作(效率更高,适合大数据量)
dplyr 1.1.0及以上版本可以配合pick()和purrr的映射函数实现向量化计算,比逐行分组性能高很多:
df_res <- df %>% mutate(Value = map2_chr( .x = pick(starts_with("Col_")), # 选中所有待提取的列,顺序和序号规则匹配 .y = 列序号, .f = ~ .x[[.y]] # 按序号取对应列的值 ))
注意事项
- 待提取列的排列顺序要和序号的计数规则完全对应,比如序号1对应第一列、序号14对应第14列,如果前缀匹配不能保证顺序,可以用
num_range("Col_", 1:最大列数)或者手动罗列列名的方式指定顺序。 - 如果提取的列值不是字符类型,可以把
map2_chr换成对应类型的映射函数,比如数值型用map2_dbl、通用类型用map2_vec。
内容的提问来源于stack exchange,提问作者Jakub Morze
相关产品推荐
相关产品推荐

