对于如下数据框
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”得到这个吗?
对于如下数据框
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”得到这个吗?
有几种方法可以获得所需的结果,这里有一些: 您可以使用split
and 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
或者您可以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
为什么需要dcast
?aggregate
在基础 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