如何在R中根据指示列的值选取对应列生成新列?
在R中根据指示列批量选取对应列的值
下面提供几种高效、避免冗长ifelse的解决方案,适用于任意数量的目标列:
1. Base R 矩阵索引法(最高效,推荐大数据场景)
利用矩阵索引直接定位每行要提取的元素,速度极快:
# 构造示例数据 df <- data.frame( selection = c(1, 3, 2, 4, NA), column1 = c(10, 20, 30, 40, 50), column2 = c(100, 200, 300, 400, 500), column3 = c(1000, 2000, 3000, 4000, 5000), column4 = c(10000, 20000, 30000, 40000, 50000) ) # 提取所有以column开头的目标列(确保顺序是column1、column2...) target_cols <- df[, grep("^column\\d+$", names(df))] # 用矩阵索引生成新列:每行对应行号 + selection指定的列号 df$newcolumn <- target_cols[cbind(seq_len(nrow(target_cols)), df$selection)]
- 原理:
cbind(行号, 列号)生成一个矩阵,R会按矩阵的每个坐标提取对应元素 - 边界处理:如果
selection是NA或者超出目标列的范围,会返回NA,符合预期
2. dplyr 简洁实现(适合tidyverse用户)
用rowwise()结合pick(),代码可读性强:
library(dplyr) df <- df %>% rowwise() %>% mutate(newcolumn = pick(all_of(paste0("column", selection)))) %>% ungroup()
- 注意:
rowwise()在处理超大数据量时效率略低于矩阵索引,但日常使用足够便捷
3. data.table 高性能实现(适合超大规模数据集)
data.table的操作全程在内存中进行,速度优势明显:
library(data.table) setDT(df) # 匹配目标列 cols <- grep("^column\\d+$", names(df)) # 按行提取对应列的值 df[, newcolumn := mapply(function(row_idx, col_idx) .SD[row_idx, col_idx], seq_len(.N), selection, .SDcols = cols)]
内容的提问来源于stack exchange,提问作者user1165199
相关产品推荐
相关产品推荐

