R求和数据透视表

时间:2012-07-24 09:18:28

标签: r

对于数据框如下

id<-c(1,1,2,3,3,2)
p<-c(10,0,22,34,0,0)
df<-data.frame(id,p)

我需要一个像

这样的汇总表
id   p
1    10
2    22
3    34

实际上是每个id的p的聚合总和。 我可以用'dcast'来获得这个吗?

2 个答案:

答案 0 :(得分:5)

有几种方法可以获得所需的结果,以下是一些方法: 您可以使用splitsapply

df <- data.frame(id, p)
sapply(split(df, df$id), function(x) sum(x$p))
 1  2  3 
10 22 34

或者与tapply相比更短:

 tapply(p, id, sum)
 1  2  3 
10 22 34 

或者您可以使用ddply包中的plyr

library(plyr)
ddply(df, .(id), function(x) sum(x$p))
  id V1
1  1 10
2  2 22
3  3 34

最后,您还可以使用by

 by(p, id, sum)
id: 1
[1] 10
------------------------------------------------------------ 
id: 2
[1] 22
------------------------------------------------------------ 
id: 3
[1] 34

答案 1 :(得分:3)

为什么需要dcast?在基础R中尝试aggregate

df <- data.frame(id = c(1,1,2,3,3,2),
                 p = c(10,0,22,34,0,0))
aggregate(df, by=list(id), sum)
#   Group.1 id  p
# 1       1  2 10
# 2       2  4 22
# 3       3  6 34

您还可以如下所示欺骗dcast。您的数据不完全符合dcast的预期“熔化”形式:

library(reshape2)
dcast(df, id ~ ., value.var = "p", sum)
#   id NA
# 1  1 10
# 2  2 22
# 3  3 34