使用R apply函数对结果进行转置

4

抱歉,我刚意识到这个问题已经在这里有了答案。

这应该是很基本的问题,但我真的不明白为什么会发生。能有人帮忙吗?以下是一个使用示例"data" 的简单代码:

applyDirichletPrior <- function (row_vector) {
  row_vector_added <- row_vector + min (row_vector)
  row_vector_result <- row_vector_added / sum(row_vector_added)
}
data <- matrix(c(1,2,3,4,5,6,7,8), nrow=2, ncol=4)
applied <- apply(data, 1, function(x) applyDirichletPrior(x))

输出结果如下:
> applied
     [,1]      [,2]
[1,]  0.1 0.1428571
[2,]  0.2 0.2142857
[3,]  0.3 0.2857143
[4,]  0.4 0.3571429

我希望输出数据的格式与输入数据相同,例如:

> applied
          [,1]      [,2]      [,3]      [,4]
[1,] 0.1000000 0.2000000 0.3000000 0.4000000
[2,] 0.1428571 0.2142857 0.2857143 0.3571429

为什么在apply的哪个阶段会发生转置?

请参阅 https://stat.ethz.ch/pipermail/r-help/2006-January/086064.html 和 http://www.jstatsoft.org/v40/i01 中的讨论。 - hadley
1个回答

8

将各个apply步骤的结果组合起来有点随意。您为什么希望结果不同呢?您看到的行为正是文档描述的内容:

如果每次调用'FUN'返回长度为'n'的向量,则如果'n > 1','apply'会返回一个维度为'c(n, dim(X)[MARGIN])'的数组。

请注意,您可以随后轻松执行转置操作:

> t(applied)
          [,1]      [,2]      [,3]      [,4]
[1,] 0.1000000 0.2000000 0.3000000 0.4000000
[2,] 0.1428571 0.2142857 0.2857143 0.3571429

1
+1,另一种方法是返回一个列表,然后在其上调用rbinddo.call(rbind, unlist(apply(data, 1, function(x) list(applyDirichletPrior(x))), rec=FALSE)) - Arun
1
我原本期望这个函数能够通过在每一行应用指定的函数来修改(2*4)矩阵,然后生成一个与输入具有相同维度的输出。我理解apply函数并不适用于此目的。 - Zhubarb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接