5

我知道我可以使用 apply 评估一个包含多个数据的函数,但是我可以使用一个数据评估多个函数吗?使用 sapply 我可以得到:

sapply(list(1:5,10:20,5:18), sum)

但我想要这样的东西:

sapply(1:5, list(sum, min,max))

并得到

15 1 5

有什么聪明的主意吗?:)

4

4 回答 4

8

交换参数顺序,因为您循环的是函数而不是数据。

sapply(list(sum, min, max), function(f) f(1:5))

计算汇总统计数据的两种最受青睐的现代方法使用dplyrdata.table包。 使用ordplyr有多种解决方案(仅使用数据帧,而不是向量)。summarisesummarise_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惯用风格是使用链式构造表达式。

data %>%
 summarise(min = min(x), max = max(x), sum = sum(x))
data %>%
  summarise_each(funs(min, max, sum))

对于编程使用(相对于交互式使用),建议使用下划线后缀的函数和公式进行非标准评估

data %>%
 summarise_(min = ~ min(x), max = ~ max(x), sum = ~ sum(x))
data %>%
  summarise_each_(funs_(c("min", "max", "sum"), "x")

有关解决方案,请参阅agstudy 的答案data.table

于 2013-07-18T10:55:36.703 回答
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
于 2013-07-18T10:14:39.107 回答
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
于 2013-07-18T10:18:41.817 回答
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
于 2015-01-04T06:02:49.697 回答