了解r中的sapply函数

时间:2016-05-26 11:04:30

标签: r sapply

这可能是最愚蠢的问题,但我似乎没有把握这个功能:这是我的问题

      Example: 
      d = matrix(1:10, 5,2)
      d[3] = NA

 #              [,1] [,2]
         #[1,]    1    6
         #[2,]    2    7
         #[3,]   NA    8
         #[4,]    4    9
         #[5,]    5   10

如果我想使用sapply函数计算行意味着我会使用这样的东西:

       sapply(d,mean)
       #[1]  1  2 NA  4  5  6  7  8  9 10

它不应该给我元素列表的平均值吗?它只是吐出我的矩阵的元素而不是平均值。

当我使用申请时,我得到了正确答案:

   apply(d,1,mean, na.rm=T)
   [1] 3.5 4.5 8.0 6.5 7.5

任何人都可以给我一个非常虚拟的解释。非常高兴。 在提出问题之前使用以下链接。 link 1 Link 2 Link 3

2 个答案:

答案 0 :(得分:2)

您是否阅读过?sapply。该函数采用向量或表达式对象。它不能采用矩阵。所以在你的例子中发生的是矩阵d被认为是数字的向量:

sapply(as.numeric(d),mean)

答案 1 :(得分:2)

sapply(及其朋友,如lapply)需要一个列表(或data.frame,它实际上是一种特殊的列表)作为输入。但即使您已将矩阵转换为数据框,它也不会给您意味着,它会给您意味着。如果你想了解这些函数是如何工作的,那么查看这个函数(从这里复制:http://adv-r.had.co.nz/Functionals.html)可能会有所帮助,它使用基数R显示lapply的本质。sapply以同样的方式工作,它只是尝试将输出简化为向量而不是总是返回列表。)

lapply2 <- function(x, f, ...) {
 out <- vector("list", length(x))
 for (i in seq_along(x)) {
   out[[i]] <- f(x[[i]], ...)
  }
  out
}

顺便说一句,如果问题的关键在于找到计算行均值的最佳方法,而不是理解sapply,那么有一个函数rowMeans是最快的做法它 - 比使用apply更快,例如。