理解 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
更快。
这可能是最愚蠢的问题,但我似乎没有掌握 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
更快。