【问题标题】:apply in R returns weird results [duplicate]在R中应用返回奇怪的结果[重复]
【发布时间】:2016-06-30 18:42:01
【问题描述】:

我试图将矩阵的每一行除以同一行的总和:

a <- matrix(1:25,nrow=5,ncol=5)
a <- apply(a,1,function(x) x/sum(x))

这给出了预期的结果,但它是按列而不是按行构造的:

           [,1]       [,2]       [,3]       [,4]       [,5]
[1,] 0.01818182 0.03333333 0.04615385 0.05714286 0.06666667
[2,] 0.10909091 0.11666667 0.12307692 0.12857143 0.13333333
[3,] 0.20000000 0.20000000 0.20000000 0.20000000 0.20000000
[4,] 0.29090909 0.28333333 0.27692308 0.27142857 0.26666667
[5,] 0.38181818 0.36666667 0.35384615 0.34285714 0.33333333

【问题讨论】:

  • 不知道,我刚刚查了 ?matrix,你认为如果我输入 byrow=TRUE,它会解决问题吗?
  • 没有什么叫col。请将其更改为 ncol 并为您想要的结果添加 byrow =TRUE

标签: r matrix apply


【解决方案1】:

因为矩阵是由列构成的,所以将矩阵除以行和得到正确的结果:

> a / rowSums(a)
           [,1]      [,2] [,3]      [,4]      [,5]
[1,] 0.01818182 0.1090909  0.2 0.2909091 0.3818182
[2,] 0.03333333 0.1166667  0.2 0.2833333 0.3666667
[3,] 0.04615385 0.1230769  0.2 0.2769231 0.3538462
[4,] 0.05714286 0.1285714  0.2 0.2714286 0.3428571
[5,] 0.06666667 0.1333333  0.2 0.2666667 0.3333333

这是因为rowSums 返回的向量被回收了。

要使apply 工作,您只需转置结果,因为apply 的返回值是按列而不是按行建立的。

【讨论】:

  • 所以“a / rowSums(a)”将“a”的行除以它们各自的总和是默认方式吗?如果您想将“a”的列除以 rowSums 怎么办?
  • 假设你想将每一列除以它的总和,那么你可以像你所做的那样使用apply,或者也许a / rep(colSums(a), each=nrow(a))。将每列除以行和(对于方阵)也是如此。
【解决方案2】:

这就是apply 应该工作的方式。默认情况下,矩阵在 R 中按列填充。注意 ?apply 的文档:

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

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多