r - Tidyverse 中向量的动态选择

标签 r tidyverse

我有一个小玩意A例如:

<表类=“s-表”> <标题> X1 X2 X3 <正文> x1_1 x2_1 x3_1 x1_2 x2_2 x3_2 x1_3 x2_3 x3_3 x1_4 x2_4 x3_4

还有一个向量 Y :(X2,X1,X3,X1...)

我想选择单个向量 B :(x2_1,x1_2,x3_3,x1_4...)仅表 A 中的值,例如B[n]Y[n] 列中选择的元素.

我想在 tidyverse 管道中执行此操作,我想避免任何 forapply .

在将 Y 转换为引用 A 列位置的整数后,我尝试过:

A %>% add_column(Y = Y) %>%
  mutate(B = .[,Y])

但它没有正确矢量化。

最佳答案

我们可以使用rowwise

library(dplyr)
A %>% 
   add_column(Y = Y) %>%
   rowwise %>%
   mutate(B = cur_data()[[Y]]) %>%
   ungroup

-输出

# A tibble: 4 × 5
  X1    X2    X3    Y     B    
  <chr> <chr> <chr> <chr> <chr>
1 x1_1  x2_1  x3_1  X2    x2_1 
2 x1_2  x2_2  x3_2  X1    x1_2 
3 x1_3  x2_3  x3_3  X3    x3_3 
4 x1_4  x2_4  x3_4  X1    x1_4 

或者使用get

A %>%
     mutate(Y = Y)  %>% 
     rowwise %>%
     mutate(B = get(Y)) %>% 
     ungroup

或者使用矢量化解决方案

A %>%
   mutate(B = .[cbind(row_number(), match(Y, names(.)))])
    X1   X2   X3    B
1 x1_1 x2_1 x3_1 x2_1
2 x1_2 x2_2 x3_2 x1_2
3 x1_3 x2_3 x3_3 x3_3
4 x1_4 x2_4 x3_4 x1_4

或者在base R中使用矢量化行/列索引

A$B <- A[cbind(seq_len(nrow(A)), match(Y, names(A)))]

数据

A <- structure(list(X1 = c("x1_1", "x1_2", "x1_3", "x1_4"), X2 = c("x2_1", 
"x2_2", "x2_3", "x2_4"), X3 = c("x3_1", "x3_2", "x3_3", "x3_4"
)), class = "data.frame", row.names = c(NA, -4L))

Y <- c("X2", "X1", "X3", "X1")

关于r - Tidyverse 中向量的动态选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69692966/

相关文章:

r - R 中的新列,用于累积计数(相加)唯一日期

r - 查找并中断重复运行

r - 带有严重偏斜数据的 ggplot stat_bin2d 图

r 组滞后总和

R - 具有许多标题行的透视数据集

r - R中绘图中同一组的循环点

r - 如何使用带有葡萄牙口音的R包考试?

r - group_by 并创建一系列每月日期

r - 在读取多个 CSV 文件时,base R 比 readr 更快

r - 数据参数如何通过 ggplot 传递?