2013-07-18 36 views
5

Tôi biết rằng tôi có thể đánh giá một hàm có nhiều dữ liệu bằng cách áp dụng, nhưng tôi có thể đánh giá nhiều hàm bằng một dữ liệu không? Sử dụng sapply tôi có thể nhận được:Đánh giá nhiều hàm sử dụng một dữ liệu trong R

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

nhưng tôi muốn somethnig như thế này:

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

và nhận

15 1 5 

Bất kỳ ý tưởng thông minh? :)

Trả lời

8

Swap trình tự lập luận, vì bạn đang Looping trên các chức năng không dữ liệu.

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

Hai cách tiếp cận hiện đại được ưa thích nhất để tính toán thống kê tóm tắt sử dụng dplyrdata.table gói. dplyr có nhiều giải pháp (chỉ hoạt động với khung dữ liệu, không phải vectơ) sử dụng summarise hoặc 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)) 

Kiểu dplyr là cách đơn giản để xây dựng biểu thức sử dụng chaining.

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

Để sử dụng chương trình (như trái ngược với sử dụng tương tác), các chức năng nhấn-hậu tố và formulae được đề nghị cho non-standard evaluation.

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

Xem agstudy's answer cho các giải pháp data.table.

3

Bạn có thể đánh giá nhiều chức năng trên nhiều dữ liệu. Chỉ cần sử dụng một chức năng vô danh như thế này:

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

Sử dụng summarize từ 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 

Hoặc sử dụng 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 
1

Đây là một thứ khác mà chúng tôi có thể thêm vào nồi. Rất tốt khi làm việc với các danh sách lớn.

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