我在R写作我的第一个节目,作为一个新手,我有一些麻烦,希望你能帮助我。
我有一个像这样的数据框:
> v1<-c(1,1,2,3,3,3,4)
> v2<-c(13,5,15,1,2,7,4)
> v3<-c(0,3,6,13,8,23,5)
> v4<-c(26,25,11,2,8,1,0)
> datos<-data.frame(v1,v2,v3,v4)
> names(datos)<-c("Position","a1","a2","a3")
> datos
posicion a1 a2 a3
1 1 13 0 26
2 1 5 3 25
3 2 15 6 11
4 3 1 13 2
5 3 2 8 8
6 3 7 23 1
7 4 4 5 0
我需要的是将由a1
分组的a2
,a3
和a1
(在我的实际案例中,从a51
到Position
)中的数据相加。我正在尝试使用aggregate()
函数,但它只适用于手段,而不是总和,我不知道为什么。
提前致谢
这与plyr
库相当简单。
library("plyr")
ddply(datos, .(Position), colwise(sum))
如果您有其他不应该平均的非数字列,则可以使用
ddply(datos, .(Position), numcolwise(sum))
您需要告诉聚合函数使用sum,因为默认值是获取每个类别的平均值。例如:
aggregate(datos[,c("a1","a2","a3")], by=list(datos$Position), "sum")
ag_df <-- aggregate(.~Position,data=datos,sum)
应该为您提供一个数据框,其中包含每个职位的“a”值之和。这里的诀窍是。公式中的公式表示公式中所有“非分组”变量的列表。
请注意,您可以获得与以下相同的结果:
sumdf <- rowsum(datos,datos$Position,na.rm=T)
除此之外还包括职位的总和!
如果您不希望聚合所有非组列,则可以使用cbind,如下所示:
sumdf1 <- aggregate(cbind(a1,a3)~datos$Position,datos,sum)
这只是a1和a3列的总和。