R:从一列中删除重复并将另一列相加

时间:2016-11-07 18:09:04

标签: r

假设我有一个如下所示的数据矩阵:

   X1  X2      X3
1   1 869 1956.78
2   1 869 2006.52
3   1 869 1592.80
4   1 869 6620.00
5   1 869  228.22
6   1 869  110.15
7   1 869 1350.79
8   1 869   78.36
9   1 869  118.61
10  1 869  453.99
11  1 869 5393.16
12  1 869 1641.34
13  1 869  885.80
14  1 869  352.80
15  1 869  105.64
16  2   1    0.00
17  2 313    0.00
18  2 467    0.00
19  2 495    0.00
20  2 135    0.00
21  2 769    0.00
22  2 770    0.00
23  2 771    0.00
24  1 869  375.60
25  2 869    0.00
26  2 869    0.00
27  2 869    0.00
28  2   1    0.00
29  2   1    0.00
30  2 467    0.00

我想将其格式化为:

   X1  X2       X3
1   1 869 22894.96
2   2   1    0.00
3   2 313    0.00
4   2 467    0.00
5   2 495    0.00
6   2 135    0.00
7   2 769    0.00
8   2 770    0.00
9   2 771    0.00
10  1 869  375.60
11  2 869    0.00
12  2   1    0.00
13  2 467    0.00

基本上,我想删除X2X1中的连续重复,然后将X3中的相关值相加。

这对我来说似乎是一个非常复杂的想法,也许有一个优雅的解决方案。我知道如果X3不为零,则X1中的对应值为" 1"。所以我可以通过使用展示位置来确定这种情况:

placement <- grep(1, df$X1)

我不确定如何从这里继续。

3 个答案:

答案 0 :(得分:4)

以下是data.table的解决方案。假设data.frame名为df,

library(data.table)
setDT(df)

df[, temp:=rleid(X1, X2)][, .(X3=sum(X3)), by=.(X1, X2, temp)][, temp := NULL][]
    X1  X2       X3
 1:  1 869 22894.96
 2:  2   1     0.00
 3:  2 313     0.00
 4:  2 467     0.00
 5:  2 495     0.00
 6:  2 135     0.00
 7:  2 769     0.00
 8:  2 770     0.00
 9:  2 771     0.00
10:  1 869   375.60
11:  2 869     0.00
12:  2   1     0.00
13:  2 467     0.00

[]的多次使用,称为链接,允许在一行代码中进行多个函数调用。此外,它允许您操作data.table,然后在此操纵值上调用函数。

  • temp:=rleid(X1, X2)创建一个临时变量,为X2和X3组合创建一个ID,允许重复出现不相邻的值。
  • .(X3=sum(X3)), by=.(X1, X2, temp)通过三个变量对X3求和。
  • temp := NULL删除临时变量
  • 最后的空[]打印出结果。

答案 1 :(得分:-1)

使用aggregate()

的简短解决方案
ag <- aggregate(. ~ X2, data = df, FUN = sum)

答案 2 :(得分:-1)

调用数据集t。

    X1  X2  X3
1   1   869 1956.78
2   1   869 2006.52
3   1   869 1592.80
4   1   869 6620.00
5   1   869 228.22
6   1   869 110.15
7   1   869 1350.79
8   1   869 78.36
9   1   869 118.61
10  1   869 453.99
11  1   869 5393.16
12  1   869 1641.34
13  1   869 885.80
14  1   869 352.80
15  1   869 105.64
16  2   1   0.00
17  2   313 0.00
18  2   467 0.00
19  2   495 0.00
20  2   135 0.00
21  2   769 0.00
22  2   770 0.00
23  2   771 0.00
24  1   869 375.60
25  2   869 0.00
26  2   869 0.00
27  2   869 0.00
28  2   1   0.00
29  2   1   0.00
30  2   467 0.00

所以这是代码

s <- aggregate(X3 ~ X1 + X2, data = t , sum)

这是输出

    X1  X2  X3
1   2   1   0.00
2   2   135 0.00
3   2   313 0.00
4   2   467 0.00
5   2   495 0.00
6   2   769 0.00
7   2   770 0.00
8   2   771 0.00
9   1   869 23270.56
10  2   869 0.00