如何有效地将矢量转换为矩阵,以便矢量的值确定列,元素排序确定行,然后确定在这些索引处分配的值。
X <- c(1,2,3,1,1,3)
Y <- 1:6
Z <- myfun(X, Y)
Z ## returns matrix
# 1 NA NA
# NA 2 NA
# NA NA 3
# 4 NA NA
# 5 NA NA
# NA NA 6
我正在寻找比我的for循环更好的单线程
Z0 <- X %o% rep(NA, length(unique(X)))
for(i in 1:length(Y)){ Z0[i, X[i]] <- Y[i] }
看例子:
X <- c(1,2,3,1,1,3)
Y <- 1:6
myfun <- function(X, Y) {
Z <- matrix(NA, length(X), max(X))
Z[cbind(seq_along(X), X)] <- Y
Z
}
Z <- myfun(X, Y)
Z
如果你坚持单行,那么@ djhurio的答案可以转换为
replace(matrix(NA, length(X), max(X)), cbind(1:length(X), X), Y)
# [,1] [,2] [,3]
# [1,] 1 NA NA
# [2,] NA 2 NA
# [3,] NA NA 3
# [4,] 4 NA NA
# [5,] 5 NA NA
# [6,] NA NA 6