2016-01-02 101 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))