如何基于R数据框ref列的位置提取对应列值生成新列?
根据数据框中指定列的值作为索引提取对应列值生成新变量
问题场景
现有如下R语言数据框:
ref<- c(1,4) col1<-c(10,11) col2<-c(20,21) col3<-c(30,31) col4<-c(40,41) dfx<-data.frame(ref,col1,col2,col3,col4)
需要通过ref列的值作为索引,提取对应col+数字格式列的数值,生成新列foundval:第1行ref=1对应col1的10,第2行ref=4对应col4的41。
用户尝试执行以下代码但未得到预期结果:
dfx$found_val<- dfx[ , paste0("col",dfx$ref)]
对应的SAS等效实现代码如下:
array see{4} col1-col4; do i = 1 to 4; foundval=see(ref); end;
期望得到的数据框输出为:
ref col1 col2 col3 col4 foundval 1 1 10 20 30 40 10 2 4 11 21 31 41 41
可行解决方案
方法1:矩阵索引法
利用R的矩阵索引特性,直接定位每行要提取的行号和列名,精准取值:
dfx$foundval <- dfx[cbind(1:nrow(dfx), paste0("col", dfx$ref))]
cbind(1:nrow(dfx), paste0("col", dfx$ref))生成一个匹配行号与目标列名的矩阵,以此作为索引即可逐行提取对应值。
方法2:tidyverse风格实现
如果使用dplyr包,可以通过按行处理的方式提取:
library(dplyr) dfx <- dfx %>% rowwise() %>% mutate(foundval = pull(cur_data(), paste0("col", ref))) %>% ungroup()
rowwise()指定操作按行执行,pull()根据拼接出的列名提取当前行对应列的数值。
方法3:apply逐行遍历
通过apply函数逐行处理数据框,每行根据ref值拼接目标列名后提取对应值:
dfx$foundval <- apply(dfx, 1, function(x) { target_col <- paste0("col", x["ref"]) x[target_col] })
内容的提问来源于stack exchange,提问作者user29244550
相关产品推荐
相关产品推荐

