2016-11-07 64 views
1

说我有一个数据矩阵,看起来像这样: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) 

我不知道如何从这里继续。

+0

不太。我不希望任何一列中的术语都被归为独特的值。该位置很重要,我想从X2中移除连续的值,除非它们与X1有不同的值,然后我想总结与我将移除的那些连续值相关的X3的值。 – pretz

回答

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

使用聚合()A短溶液

ag <- aggregate(. ~ X2, data = df, FUN = sum) 
+1

我也这么认为,但OP希望基于连续运行的X1和X2进行分组。注意OP期望的第一行和第十行。 – Gregor

-1

呼叫数据集吨。

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 
+1

我也这么认为,但OP希望基于X1和X2的连续运行进行分组。注意OP期望的第一行和第十行。 – Gregor