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

基于参考周列将多列数据合并为新列的R语言实现问题

从DataFrame中按参考周提取对应列的值

问题背景

我有一个包含多列人员每周数据的dataframe,还有一列Week表示参考周。需要新增一列want,存储每行对应参考周的列值。

示例数据

Col1Col2Col3Col4Col5Week
ADGJM3
BEHKN2
CFHLO5

期望输出

Col1Col2Col3Col4Col5Weekwant
ADGJM3G
BEHKN2E
CFHLO5O

目前已提取出对应参考周的变量名,但无法将对应值存入want变量:

dfnames <- c("Col1", "Col2", "Col3", "Col4", "Col5") 
wantname <- dfnames[df$week]  # 注:此处应为df$Week,大小写需匹配

可复现示例数据:

df <- as.data.frame(matrix(LETTERS[1:(3 * 5)], 3))
names(df) <- paste0("Col", 1:5)
df$Week <- c(3, 2, 5)

解决方案

方法1:基础R矩阵索引(最简洁)

由于Col1到Col5的列位置正好对应1到5,而Week列的值就是对应列的位置,直接用矩阵索引提取:

df$want <- df[cbind(seq_len(nrow(df)), df$Week)]

方法2:基础R结合已提取的列名

如果你已经拿到了每行对应的列名wantname,可以用mapply逐行取值:

# 先修正大小写问题,生成正确的列名向量
dfnames <- paste0("Col", 1:5)
wantname <- dfnames[df$Week]

# 逐行提取对应列的值
df$want <- mapply(function(row_idx, col_name) df[row_idx, col_name], 
                  seq_len(nrow(df)), wantname)

方法3:tidyverse(dplyr)实现

用rowwise()按行处理,结合pick()选中目标列:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(want = pick(all_of(paste0("Col", Week))) %>% pull()) %>%
  ungroup()

方法4:data.table高效实现

适合处理大规模数据集:

library(data.table)

setDT(df)[, want := .SD[[paste0("Col", Week)]], by = .I]

内容的提问来源于stack exchange,提问作者Anna S. Mortensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:12:36