2016-01-02 65 views
-1

我有一個這樣的表D1(三列,JB Y和P)的R - 嵌套總

JB Y P 
AA 11 1 
BB 11 2 
AA 12 3 
BB 12 4 
AA 13 3 
CC 12 4 
CC 13 2 
DD 11 1 
DD 12 1 
DD 13 3 
BB 12 3 

和我所試圖做的是就是讓嵌套的集合。我的意思是結果應該是這樣的:

JB Y Avergare (P) 
AA 11 1 
AA 12 2 
AA 13 3 
BB 11 2 
BB 12 3.5 
CC 12 4 
CC 13 2 
DD 11 1 
DD 12 1 
DD 13 3 

嵌套聚合首先使用Y和比JB聚合,並提供平均P?不確定如果可能。我知道怎麼去只是簡單的彙總,但不知道是否有分析兩個(或多個步驟)數據

+0

你的意思是你想爲'JB'和'Y'的每個獨特組合'平均(P)'?如果是這樣,那麼使用'dplyr'包做'library(dplyr)'然後'd1%>%group_by(JB,Y)%>%彙總(Avergare = mean(P))''。 – eipi10

+1

'aggregate(P〜JB + Y,mydf,mean)'?爲什麼輸出中的第二個「AA」值爲2?這是一個錯字嗎? – A5C1D2H2I1M1N2O1R2T1

+0

如果有兩個類似的data.table解決方案,我不明白爲什麼以前發佈的人不被考慮。上面的代碼 – akrun

回答

0

下面是使用data.table一個解決方案:

library(data.table) 

dt <- data.table(
    JB = c("AA", "BB", "AA", "BB", "AA", "CC", "CC", "DD", "DD", "DD", "BB"), 
    Y = c(11, 11, 12, 12, 13, 12, 13, 11, 12, 13, 12), 
    P = c(1, 2, 3, 4, 3, 4, 2, 1, 1, 3, 3)) 

dt[order(JB), .(avg = mean(P)), by = .(JB, Y)] 

中間的.()用於命名聚合結果。如果不需要訂購,您可以省略第一部分,例如只需撥打 dt[, .(avg = mean(P)), by = .(JB, Y)]

+0

謝謝。它像魔術一樣工作。我使用了CSV文件並修改了你的代碼,這是我之後的代碼。 – Kalenji

0

的方式,我們可以使用data.table

library(data.table) 
setDT(df)[, list(P= mean(P)) , .(JB, Y)] 
0

通過外觀上來看,這是一種香草aggregate問題,所以你有很多可用的工具。

在基數R中,明顯的候選人是aggregate

aggregate(P ~ JB + Y, mydf, mean) 

您也可以使用 「dplyr」 包,通過@ eipi10所建議的,如果這是你的風格:

library(dplyr) 
mydf %>% group_by(JB, Y) %>% summarise(P = mean(P))