按键值总和

问题描述:

我有一个看起来像这样的数据集。你可以看到X2列有键值。我想通过列X2中的键值对列X1中的对值进行求和。我一直在尝试使用ddply或聚合,但我遇到了问题。有没有人有一个简单的方法来做到这一点?按键值总和

> X1=rnorm(30,mean=20, sd=10) 
> X2=rep(1:15,2) 
>df= data.frame(X1,X2) 
      X1 X2 
1 10.065545 1 
2 6.938315 2 
3 5.657782 3 
4 11.371521 4 
5 37.037992 5 
6 13.443674 6 
7 8.868314 7 
8 5.944946 8 
9 18.493563 9 
10 16.059931 10 
11 22.520693 11 
12 17.172936 12 
13 28.676676 13 
14 27.200911 14 
15 30.560696 15 
16 22.435021 1 
17 31.143627 2 
18 19.234473 3 
19 29.329251 4 
20 18.420183 5 
21 13.184905 6 
22 7.798989 7 
23 12.910870 8 
24 12.513204 9 
25 25.760775 10 
26 19.479005 11 
27 13.696628 12 
28 11.016639 13 
29 35.126859 14 
30 17.632507 15 
+0

什么是你的代码试过吗?你碰到什么“问题”。这似乎是聚合问题中最基本的问题。另外,在这种格式下,很难告诉数据框中的列的类。共享所涉及对象的'dput()'更好。请参阅[如何创建可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – MrFlick 2014-09-20 05:43:45

+0

这正是我想要的,谢谢!对不起,如果我很模糊 – Max 2014-09-20 05:53:53

我无法重现您的确切数据,由于您使用的rnorm,但是这是一个简单的聚合。公式方法最适合此类型。

aggregate(X1 ~ X2, df, sum) 
+0

谢谢,这就是它! – Max 2014-09-20 06:09:20

tapply也可用于:

with(df, tapply(X1, X2, sum)) 
     1  2  3  4  5  6  7  8  9  10  11  12  13  14 
26.99725 24.88007 16.62240 27.98272 62.02971 38.87095 19.60940 41.50565 61.22318 48.31883 17.12463 51.68966 53.16138 11.21039 
     15 
43.55936 

对于更大的数据集,你可以使用data.table选项

library(data.table) 
setDT(df)[, list(sum(X1, na.rm=TRUE)), by=X2] 

或者dplyr

library(dplyr) 
df %>% 
    group_by(X2) %>% 
    summarise(X1=sum(X1, na.rm=TRUE))