2013-07-18 13 views
5

Wiem, że mogę ocenić jedną funkcję z wieloma danymi za pomocą zastosowania, ale czy mogę ocenić wiele funkcji za pomocą jednej danych? Korzystanie sapply mogę dostać:Ocena wielu funkcji przy użyciu jednego z danych w R

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

ale chcę somethnig tak:

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

i dostać

15 1 5 

Każdy mądry pomysł? :)

Odpowiedz

8

Zamień kolejność argumentów, ponieważ jesteś zapętlenie nad funkcjami nie dane.

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

Dwa najbardziej korzystnymi nowoczesne metody obliczania statystyk podsumowania używać pakietów dplyr i data.table. dplyr ma wiele rozwiązań (działa tylko z ramkami danych, nie wektorami) przy użyciu summarise lub 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 -idiomatic styl jest skonstruowanie wyrażenia używając chaining.

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

Do stosowania programowej (w przeciwieństwie do interaktywnej użytku), podkreślenia-sufiksem funkcje i formulae są zalecane dla non-standard evaluation.

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

Zobacz agstudy's answer dla rozwiązania data.table.

3

Możesz ocenić wiele funkcji na wielu danych. Wystarczy użyć anonimową funkcję tak:

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

Korzystanie summarize z 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 

lub używając 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

Oto kolejny element, który możemy dodać do puli. Miło do pracy z dużymi listami.

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 
Powiązane problemy