我有一个包含交易数据的数据集。我已经有Field1,Field2,Field3和Numeric1。如何创建Index1&下表中的Index2?首先A / BB / CCC出现(Index1 = 1)五次(Index2 = 1到5)。接下来,A / BB / ddd第一次出现(Index1 = 1),有三个记录(Index2 = 1到3)。之后,A / BB / CCC再次返回四个记录(Index1 = 2,Index2 = 1到4)。这种交换发生直到Field1 = A不再存在。现在我们转到Field1 = T,整个过程重新开始。
举个例子,想象两个人正在打迷你高尔夫球。 Field1代表每场比赛的日期,Field2& Field3表示分类变量,Numeric1表示距离。 Index1将代表它们所在的孔。 Index2代表他们的笔画数量。
感谢您的帮助。
Field1 Field2 Field3 Numeric1 Index1 Index2
A BB CCC 4 1 1
A BB CCC 2 1 2
A BB CCC 12 1 3
A BB CCC 25 1 4
A BB CCC -4 1 5
A BB ddd 30 1 1
A BB ddd 8 1 2
A BB ddd 1 1 3
A BB CCC 4 2 1
A BB CCC 21 2 2
A BB CCC 12 2 3
A BB CCC -4 2 4
A BB ddd 25 2 1
A BB ddd 9 2 2
A BB ddd -1 2 3
A BB CCC 9 3 1
A BB CCC -3 3 2
A BB CCC 1 3 3
A BB ddd 5 3 1
A BB CCC 3 4 1
A BB CCC 3 4 2
A BB CCC 4 4 3
A BB CCC 20 4 4
A BB CCC 51 4 5
...
T BB CCC 6 1 1
T BB CCC 5 1 2
T BB CCC 13 1 3
重现的代码(来自@michaelvine):
Field1<-rep("A", 24)
Field2<-rep("BB", 24)
Field3<-c(rep("CCC", 5), rep("ddd",3),rep("CCC", 4), rep("ddd",3),rep("CCC", 3), rep("ddd",1),rep("CCC", 5))
Numeric1<-c(4,2,12,25,-4,6,2,1,4,21,12,-4,6,2,1,9,-3,1,-4,3,3,4,20,51)
Test_df<-data.frame(Field1,Field2,Field3,Numeric1)
答案 0 :(得分:0)
然而,由于我缺乏声誉和无法发表评论,我不确定我是否完全明白,我将以此作为答案。 Index3是我的补充,它是一个简单的paste0(),其中的事务基于我对问题和示例的解释。 希望这有帮助,
Field1<-rep("A", 24)
Field2<-rep("BB", 24)
Field3<-c(rep("CCC", 5), rep("ddd",3),rep("CCC", 4), rep("ddd",3),rep("CCC", 3), rep("ddd",1),rep("CCC", 5))
Numeric1<-c(4,2,12,25,-4,6,2,1,4,21,12,-4,6,2,1,9,-3,1,-4,3,3,4,20,51)
Index1<-c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4)
Index2<-c(1,2,3,4,5,1,2,3,1,2,3,5,1,2,3,1,2,3,1,1,2,3,4,5)
Test_df<-data.frame(Field1,Field2,Field3,Numeric1,Index1,Index2)
Test_df$Index3<-paste0(Test_df$Field1,"-",Test_df$Field2,"-",Test_df$Field3,"-",Test_df$Index1,"-",Test_df$Index2)
答案 1 :(得分:0)
使用data.table ...
library(data.table)
setDT(Test_df)
# create group ids based on sequences
Test_df[, g0 := rleid(Field1, Field2, Field3)]
# rebase group ids
Test_df[, gid := rleid(g0), by=.(Field1, Field2, Field3)]
# create row-within-group ids
Test_df[, rid := rowid(g0)]
给出了
Field1 Field2 Field3 Numeric1 g0 gid rid
1: A BB CCC 4 1 1 1
2: A BB CCC 2 1 1 2
3: A BB CCC 12 1 1 3
4: A BB CCC 25 1 1 4
5: A BB CCC -4 1 1 5
6: A BB ddd 6 2 1 1
7: A BB ddd 2 2 1 2
8: A BB ddd 1 2 1 3
9: A BB CCC 4 3 2 1
10: A BB CCC 21 3 2 2
11: A BB CCC 12 3 2 3
12: A BB CCC -4 3 2 4
13: A BB ddd 6 4 2 1
14: A BB ddd 2 4 2 2
15: A BB ddd 1 4 2 3
16: A BB CCC 9 5 3 1
17: A BB CCC -3 5 3 2
18: A BB CCC 1 5 3 3
19: A BB ddd -4 6 3 1
20: A BB CCC 3 7 4 1
21: A BB CCC 3 7 4 2
22: A BB CCC 4 7 4 3
23: A BB CCC 20 7 4 4
24: A BB CCC 51 7 4 5
Field1 Field2 Field3 Numeric1 g0 gid rid