dplyr如何根据每行随机指定的列名提取对应列的数值
R提取每行对应随机列数值的实现方法
提供两种常用实现方案,可根据场景选择:
- tidyverse管道流写法(可读性优先)
适配dplyr 1.0及以上版本,逻辑清晰易读,适合中小数据集:
逻辑说明:library(dplyr) df <- df %>% rowwise() %>% mutate(target_val = c_across(all_of(ran))) %>% ungroup()rowwise()将数据按行分组,每一行读取ran列存储的目标列名,用c_across()提取该列对应行的数值,最后用ungroup()取消行分组避免影响后续操作。 - 矩阵索引写法(性能优先)
无需逐行遍历,运行速度远高于行化操作,适合十万行以上的大数据集:
逻辑说明:构造「行号-列名」一一对应的二维索引矩阵,直接批量定位所有目标单元格的数值。df$target_val <- df[cbind(1:nrow(df), df$ran)]
效果测试示例
可通过以下测试代码验证运行结果:
library(tibble) library(dplyr) # 构造测试数据集 df <- tibble( a = 1:3, b = 4:6, c = 7:9, d = 10:12, e = 13:15, f = 16:18 ) %>% mutate(ran = sample(c("a","b","c","d","e","f"),n(), replace=T)) # 执行提取操作 df <- df %>% rowwise() %>% mutate(target_val = c_across(all_of(ran))) %>% ungroup()
运行后target_val列即为每行ran列对应列的数值。
内容的提问来源于stack exchange,提问作者Philipp Chapkovski
相关产品推荐
相关产品推荐

