在R中创建交易数据的条件指数

时间:2018-02-07 14:50:38

标签: r indexing conditional-statements

我有一个包含交易数据的数据集。我已经有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)

2 个答案:

答案 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