mapply中的rbind返回转置的维度

时间:2014-11-27 19:21:04

标签: r

我已经看到了关于这个主题的几个相关问题,例如herehere,但就我所知,解决方案对我来说似乎并不适用。

我有一个返回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矩阵并对其进行转置。但我希望有一种更明智的方式。

1 个答案:

答案 0 :(得分:2)

mapplysapply的多变量版本,使用simplify2array简化了其结果(除非您另有说明)。您不需要使用mapply,因为您只有一个变量传递给您的函数(实际上,您没有传递任何变量 - 请参阅下文)。在基数R中,您可以使用

do.call(rbind, lapply(iterations, test.func)) 

可替换do.call(rbind, ...)的其他选项包括data.table::rbindlistplyr::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}}来电可能会令人感到沮丧