通过索引在 R 中构建向量化向量
Vectorized vector construction in R through indexing
我想使用向量 A
中的值构建一个原子向量 X
,这样 length(X)>=length(A)
。此外,X
的值由第三个向量 B
索引,使得 length(B)=length(X)
。构造X的映射如下:
X[i] <- A[B[i]]
现在,我很清楚如何在 for 循环中构造向量 X
。我的问题是:由于 X
相当大 (length(X) ~ 30,000
),有没有办法向量化 X
的构造?即,应用避免逐个元素计算的一揽子函数。我研究了 sapply
和 mapply
等函数,但没有看到如何将向量 B
的索引合并到这些函数中。
例如,如果:
A <- c(20,31,17,110,87)
B <- c(1,1,2,1,1,3,4,3,5)
我希望 X
是:
X <- c(20,20,31,20,20,17,110,17,87)
矢量化非常简单,因此您可以避免使用 apply
或循环等使其过于复杂 - 只需使用 B
作为数值向量来索引 A
的值。
在您的情况下,使用 A[B]
转换为 A[c(1,1,2,1,...,5)]
,基本上是说 "return the 1st element of A, the first element of A, the second element of A, the first element of A... the fifth element of A"。
A <- c(20,31,17,110,87)
B <- c(1,1,2,1,1,3,4,3,5)
A[B]
## > A[B]
## [1] 20 20 31 20 20 17 110 17 87
X <- A[B]
我想使用向量 A
中的值构建一个原子向量 X
,这样 length(X)>=length(A)
。此外,X
的值由第三个向量 B
索引,使得 length(B)=length(X)
。构造X的映射如下:
X[i] <- A[B[i]]
现在,我很清楚如何在 for 循环中构造向量 X
。我的问题是:由于 X
相当大 (length(X) ~ 30,000
),有没有办法向量化 X
的构造?即,应用避免逐个元素计算的一揽子函数。我研究了 sapply
和 mapply
等函数,但没有看到如何将向量 B
的索引合并到这些函数中。
例如,如果:
A <- c(20,31,17,110,87)
B <- c(1,1,2,1,1,3,4,3,5)
我希望 X
是:
X <- c(20,20,31,20,20,17,110,17,87)
矢量化非常简单,因此您可以避免使用 apply
或循环等使其过于复杂 - 只需使用 B
作为数值向量来索引 A
的值。
在您的情况下,使用 A[B]
转换为 A[c(1,1,2,1,...,5)]
,基本上是说 "return the 1st element of A, the first element of A, the second element of A, the first element of A... the fifth element of A"。
A <- c(20,31,17,110,87)
B <- c(1,1,2,1,1,3,4,3,5)
A[B]
## > A[B]
## [1] 20 20 31 20 20 17 110 17 87
X <- A[B]