这可能是最愚蠢的问题,但我似乎没有把握这个功能:这是我的问题
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
答案 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
更快,例如。