2015-11-05 45 views
0

stackoverflow newbie here我讀了很多聚合(),由()和tapply()指導,但沒有找到答案。Aggregate() - R - 是否可以對所有子集和超集進行計算?

中的R幫助頁面使用示例(warpbreaks是R中的數據集),

> aggregate(breaks ~ wool + tension, data = warpbreaks, mean) 
    wool tension breaks 
1 A  L 44.55556 
2 B  L 28.22222 
3 A  M 24.00000 
4 B  M 28.77778 
5 A  H 24.55556 
6 B  H 18.77778 

但我應該怎麼代碼,如果我還需要所有超集的結果(如第7行到10) ?

wool tension breaks 
1 A  L 44.55556 
2 B  L 28.22222 
3 A  M 24.00000 
4 B  M 28.77778 
5 A  H 24.55556 
6 B  H 18.77778 
7 A  -   #mean of the set that wool=A, but no restriction to tension 
8 B  - 
9 -  L   #mean of the set that tension=L, but no restriction to wool 
10 -  -   #mean of the whole set in data frame 

如果您沒有使用聚合函數的方法也是可以的。非常感謝!


大家好,非常感謝您的回答!實際上,我有40多個子集和200多個變量來計算(例如,不僅一個變量「中斷」)。因此,我發現使用tapplyaggregate(breaks ~ tension, data = warpbreaks, mean)然後合併結果效率不高。 Plz告訴我在這種情況下是否有更好的數據處理方法!

+0

'聚合(打破張力,數據= warpbreaks,意思)'和羊毛一樣,是你問什麼? – rawr

+0

'aggregate(break〜0,data = warpbreaks,mean)'或者簡單地'mean(warpbreaks $ breaks)' – jogo

+1

這是我問過的第一個問題!也許答案是現在雖然過時,但http://stackoverflow.com/questions/16824544/apply-a-function-to-dataframe-subsetted-by-all-possible-combinations-of-categori – jenesaisquoi

回答

0

我確定有一種更優雅的方式,但簡單的tapply?後,通過一些數據操作,您可以將結果組合起來並實現所需。

> tapply(warpbreaks$breaks, warpbreaks$tension, mean) 
     L  M  H 
36.38889 26.38889 21.66667 
> tapply(warpbreaks$breaks, warpbreaks$wool, mean) 
     A  B 
31.03704 25.25926 
0

這裏有一個比較難看的答案

library(dplyr) 

variables = c("wool", "tension") 

1:length(variables) %>% 
    lapply(. %>% combn(variables, ., simplify = F)) %>% 
    unlist(recursive = F) %>% 
    c(list(character(0))) %>% 
    data_frame(variables = .) %>% 
    rowwise %>% 
    do({group_by_(warpbreaks, .dots = variables) %>% 
     summarize(breaks = mean(breaks))}) 
0

感謝大家。從中學到很多東西。 Dupe回答: dplyr summarize with subtotals 給出了網格expand.grid,並用函數填充。對我而言,因爲我有超過一個變量來總結我的真實數據(2000多個變量而不是一個「break」),所以我發現最快的答案是難看的。

result1 <- aggregate(breaks ~ wool + tension, data = warpbreaks, mean) 
result2 <- aggregate(breaks ~ wool, data = warpbreaks, mean) 
result3 <- aggregate(breaks ~ tension, data = warpbreaks, mean) 
result4 <- aggregate(breaks ~ 0, data = warpbreaks, mean) 
result <- rbind(result1,result2, result3,result4) 
相關問題