假设我有一个如下所示的数据矩阵:
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
基本上,我想删除X2
和X1
中的连续重复,然后将X3
中的相关值相加。
这对我来说似乎是一个非常复杂的想法,也许有一个优雅的解决方案。我知道如果X3不为零,则X1中的对应值为" 1"。所以我可以通过使用展示位置来确定这种情况:
placement <- grep(1, df$X1)
我不确定如何从这里继续。
答案 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