R: sapply 有效,但 lapply 无效

标签 r functional-programming lapply sapply

我试图更好地理解 lapply 和 sapply 之间的区别。在下面的示例中,为什么后者有效,而前者无效?

# Data

  data <- data.frame("A" = rnorm(500, 0, 1), 
                     "B" = rnorm(500, 0, 1), 
                     "C" = sample(c("a", "b" , "c"), 500, replace = T))

# Give the mean of all numeric elements in the dataframe. 

  lapply(data[lapply(data, is.numeric)], mean) # Doesn't work

  Error in `[.default`(data, lapply(data, is.numeric)) : 
  invalid subscript type 'list'

  lapply(data[sapply(data, is.numeric)], mean) # Works

最佳答案

lapply 默认返回一个列表:

来自文档:

lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X.

sapply 默认返回一个向量:

来自文档:

sapply is a user-friendly version and wrapper of lapply by default returning a vector.

因此,当您像这样 data[sapply(data, is.numeric)] 对 data.frame 进行切片/子集时,您需要传递一个元素向量,否则它将无法工作。这就是为什么 sapply 有效而 lapply 无效的原因。

关于R: sapply 有效,但 lapply 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603944/

相关文章:

r - knitr 运行时需要 Rmd 的文件名

r - 如何在 R 中绘制因子变量

recursion - SML 中的模式匹配 - 将列表表示为 (x::y)

r - 在R中循环嵌套列表

r - 访问 R *apply 函数处理的元素的名称

从 R 中的 CSV 文件读取 `...` 中定义的函数输入值

R 中精确匹配任意数量字符的正则表达式

R 列表的交集

javascript - 基本数组构造的函数式方法

javascript - Rethinkdb 将对象数组转换为单个对象