基于参考周列将多列数据合并为新列的R语言实现问题
从DataFrame中按参考周提取对应列的值
问题背景
我有一个包含多列人员每周数据的dataframe,还有一列Week表示参考周。需要新增一列want,存储每行对应参考周的列值。
示例数据
| Col1 | Col2 | Col3 | Col4 | Col5 | Week |
|---|---|---|---|---|---|
| A | D | G | J | M | 3 |
| B | E | H | K | N | 2 |
| C | F | H | L | O | 5 |
期望输出
| Col1 | Col2 | Col3 | Col4 | Col5 | Week | want |
|---|---|---|---|---|---|---|
| A | D | G | J | M | 3 | G |
| B | E | H | K | N | 2 | E |
| C | F | H | L | O | 5 | O |
目前已提取出对应参考周的变量名,但无法将对应值存入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
相关产品推荐
相关产品推荐

