2016-11-07 62 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