2

对于如下数据框

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”得到这个吗?

4

2 回答 2

5

有几种方法可以获得所需的结果,这里有一些: 您可以使用splitand sapply

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

或者更短的 with tapply

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

或者您可以ddplyplyr包中使用:

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
于 2012-07-24T09:26:08.560 回答
3

为什么需要dcastaggregate在基础 R 中尝试:

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
于 2012-07-24T09:23:30.650 回答