Tidyverse中如何按向量动态选取tibble每行对应列的值
问题原因
原有代码失效的核心原因是.[,Y]语法会一次性选中Y向量中所有值对应的全部列,返回多列tibble结构,无法实现逐行匹配Y中对应列取值的向量化选择需求。
实现方案
方案1:矩阵索引(性能最优,适合大数据集)
R原生支持矩阵式索引提取数据框值,直接传入「行号-列号」的配对矩阵即可逐行提取对应值,管道实现代码如下:
library(tidyverse) # 示例数据构造 A <- tibble(X1 = 1:4, X2 = 5:8, X3 = 9:12) Y <- c("X2", "X1", "X3", "X1") # 若Y已为整数列索引可直接使用,无需匹配列名 # 管道计算向量B B <- A %>% mutate(B = .[cbind(row_number(), match(Y, names(.)))]) %>% pull(B)
如果Y已经提前转换为A的列位置整数,上述代码可以简化为:
B <- A %>% mutate(B = .[cbind(row_number(), Y)]) %>% pull(B)
方案2:行化操作(可读性更高,适合小数据集)
如果更偏好dplyr的语义化写法,可以用rowwise()逐行处理:
B <- A %>% add_column(Y = Y) %>% rowwise() %>% mutate(B = c_across(all_of(Y))) %>% pull(B)
两种方案最终输出的B都符合需求,对应示例数据的输出结果为5, 2, 11, 4,即x2_1=5、x1_2=2、x3_3=11、x1_4=4。
内容的提问来源于stack exchange,提问作者GiulioGCantone
相关产品推荐
相关产品推荐

