gpt4 book ai didi

r - 使用从变量中选择的列名逐行索引数据帧

转载 作者:行者123 更新时间:2023-12-04 07:54:54 25 4
gpt4 key购买 nike

考虑以下数据帧:

TEST <- structure(list(Value = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
Select = structure(c(2L, 1L, 3L, 2L, 2L, 1L, 1L,
2L, 1L, 1L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),
A = c(5L, 5L, 4L, 3L, 4L, 3L, 5L, 3L, 3L, 4L, 5L, 4L),
B = c(10L, 8L, 7L, 6L, 3L, 8L, 8L, 7L, 8L, 9L, 11L, 8L),
C = c(0L, 1L, 3L, 2L, 0L, 3L, 0L, 2L, 0L, 1L, 1L, 0L)),
.Names = c("Value", "Select", "A", "B", "C"),
row.names = c(NA, -12L),
class = "data.frame")

我想基于“选择”列,从A,B和C列的集合中,逐行有效地分配“值”列。

例如,在第1行中,我希望Value等于B列中的元素-即Value [1] = 10。

我当前的方法是使用for循环:
for( idx in 1:nrow(TEST) ) {
TEST$Value[idx] <- TEST[ idx, as.character(TEST$Select[idx]) ]
}

产生所需的输出:

值选择A B C
1 10 B 5 10 0
2 5 A 5 8 1
3 3 C 4 7 3
4 6 B 3 6 2
5 3 B 4 3 0
6 3 A 3 8 3
7 5 A 5 8 0
8 7 B 3 7 2
9 3 A 3 8 0
10 4 A 4 9 1
11 1 C 5 11 1
12 0 C 4 8 0

有没有更有效或替代的方式来做到这一点?我觉得这是某种merge()或表联接类型的操作。

P.S.我不太确定如何描述此操作-也欢迎提出任何有关更好的问题/描述的建议。

最佳答案

我会使用矩阵索引和match。该方法是矢量化的,因此比forapply循环给您的速度快得多:

L <- c("A", "B", "C")
TEST$Value <- TEST[L][cbind(seq_len(nrow(TEST)), match(TEST$Select, L))]

如果您不熟悉矩阵索引,则可以在 ?"["中进行记录:

A third form of indexing is via a numeric matrix with the one column for each dimension: each row of the index matrix then selects a single element of the array, and the result is a vector

关于r - 使用从变量中选择的列名逐行索引数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18056799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com