我已经看到了关于这个主题的几个相关问题,例如here和here,但就我所知,解决方案对我来说似乎并不适用。
我有一个返回5x3矩阵的函数。我使用mapply迭代函数4次。我的目标是让mapply调用返回一个20x3矩阵,但它返回一个15x4矩阵。
population <- runif(100, 0, 1)
iterations <- seq(1:4)
test.func <- function(k){
samp1 <- sample(population, 20, replace = FALSE)
samp2 <- sample(population, 20, replace = FALSE)
samp3 <- sample(population, 20, replace = FALSE)
## Pre-allocate
c1 <- NULL
c2 <- NULL
c3 <- NULL
for (i in 1:5){
c1[i] <- samp1[i]
c2[i] <- samp2[i]
c3[i] <- samp3[i]
}
combined <- cbind(c1, c2, c3)
print(combined)
}
results <- mapply(FUN = test.func, k = iterations)
我在功能中尝试了转置,但这并没有帮助。我也可以选择在调用mapply之后解决问题的选项。
另一种方法是将5x3矩阵转换为数据帧,然后将它们分成3x20矩阵并对其进行转置。但我希望有一种更明智的方式。
答案 0 :(得分:2)
mapply
是sapply
的多变量版本,使用simplify2array
简化了其结果(除非您另有说明)。您不需要使用mapply
,因为您只有一个变量传递给您的函数(实际上,您没有传递任何变量 - 请参阅下文)。在基数R中,您可以使用
do.call(rbind, lapply(iterations, test.func))
可替换do.call(rbind, ...)
的其他选项包括data.table::rbindlist
和plyr::rbind.fill
此外,您永远不会将k
传递给该函数,因此您甚至可以使用replicate
。但同样,由于replicate
基本上是sapply
,因此您需要simplify = FALSE
test.func() ## notice that k is not used at all
# c1 c2 c3
# [1,] 0.6087179 0.04439165 0.11227567
# [2,] 0.8915234 0.79688365 0.02446302
# [3,] 0.5635389 0.17794940 0.16731767
# [4,] 0.7040224 0.17201792 0.28175588
# [5,] 0.8999534 0.28175588 0.58302149
PS - 我还将你的最后两行浓缩为一个
combined <- cbind(c1, c2, c3)
print(combined)
可以
cbind(c1, c2, c3)
当print
x <- test.func()
时,{{1}}来电可能会令人感到沮丧