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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:02