理解 r 中的 apply 函数

understanding sapply function in 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 时,我得到了正确答案:

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

谁能麻烦给我一个非常假的 explanation.Highly appreicated。 在提问之前使用了以下链接。 link 1 Link 2 Link 3

你读过?sapply了吗?该函数采用向量或表达式对象。它不能采用矩阵。因此,在您的示例中发生的情况是矩阵 d 被视为数字向量:

sapply(as.numeric(d),mean)

sapply(及其朋友,如 lapply)需要一个列表(或 data.frame,这是一种特殊的列表)作为输入。但是即使你把你的矩阵变成了一个数据框,它也不会给你 row 的意思,它会给你 column 的意思.如果您想了解这些函数的工作原理,查看此函数(从此处复制: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 更快。