【问题标题】:Creating Conditional Indices on Transactional Data in R在 R 中为事务数据创建条件索引
【发布时间】:2018-07-17 21:56:08
【问题描述】:

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

【问题讨论】:

    标签: r indexing conditional-statements


    【解决方案1】:

    使用 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
    

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解,但是,由于我缺乏声誉且无法发表评论,我将提供此作为答案。 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)
      

      【讨论】:

      • 问题假设您有前四列,但没有索引列。我正在尝试找出捕捉这些的最佳方法。
      猜你喜欢
      • 2016-12-10
      • 2021-02-02
      • 1970-01-01
      • 2023-02-23
      • 2011-12-02
      • 1970-01-01
      • 2021-05-21
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多