我知道我可以使用apply评估一个包含许多数据的函数,但是我可以使用一个数据评估许多函数吗? 使用sapply我可以得到:
sapply(list(1:5,10:20,5:18), sum)
但我想要像这样的东西:
sapply(1:5, list(sum, min,max))
并获取
15 1 5
任何聪明的主意? :)
答案 0 :(得分:8)
交换参数顺序,因为你循环遍历函数而不是数据。
sapply(list(sum, min, max), function(f) f(1:5))
计算摘要统计信息的两种最受欢迎的现代方法使用dplyr
和data.table
包。 dplyr
使用summarise
或summarise_each
提供了各种解决方案(仅处理数据框,而不是向量)。
library(dplyr)
data <- data.frame(x = 1:5)
summarise(data, min = min(x), max = max(x), sum = sum(x))
summarise_each(data, funs(min, max, sum))
dplyr
- 惯用风格是使用chaining构建表达式。
data %>%
summarise(min = min(x), max = max(x), sum = sum(x))
data %>%
summarise_each(funs(min, max, sum))
对于程序化使用(与交互式使用相反),建议formulae使用下划线后缀函数和non-standard evaluation。
data %>%
summarise_(min = ~ min(x), max = ~ max(x), sum = ~ sum(x))
data %>%
summarise_each_(funs_(c("min", "max", "sum"), "x")
请参阅agstudy's answer了解data.table
解决方案。
答案 1 :(得分:3)
您可以评估许多数据上的许多功能。只需使用这样的匿名函数:
sapply( list(1:5,10:20,5:18), function(x) c( Sum = sum(x) , Min = min(x) , Max = max(x) ) )
# [,1] [,2] [,3]
#Sum 15 165 161
#Min 1 10 5
#Max 5 20 18
答案 2 :(得分:2)
使用summarize
中的plyr
:
library(plyr)
summarize(data.frame(x=1:5),min=min(x),max=max(x),sum=sum(x))
min max sum
1 1 5 15
或使用data.table
library(data.table)
data.table(x=1:5)[,list(min=min(x),max=max(x),sum=sum(x))]
min max sum
1: 1 5 15
答案 3 :(得分:1)
这是我们可以添加到锅中的另一个。很适合使用大型列表。
funs <- list(sum = sum, min = min, max = max)
Map(function(f, ...) f(...), funs, list(x = 1:15))
# $sum
# [1] 120
#
# $min
# [1] 1
#
# $max
# [1] 15