对于数据框如下
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'来获得这个吗?
答案 0 :(得分:5)
有几种方法可以获得所需的结果,以下是一些方法:
您可以使用split
和sapply
:
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