我有一个小玩意A
例如:
还有一个向量 Y
:(X2,X1,X3,X1...)
我想选择单个向量 B
:(x2_1,x1_2,x3_3,x1_4...)
仅表 A
中的值,例如B[n]
在 Y[n]
列中选择的元素.
我想在 tidyverse 管道中执行此操作,我想避免任何 for
或apply
.
在将 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/