【问题标题】:Finding difference between two columns based on condition in another column根据另一列中的条件查找两列之间的差异
【发布时间】:2017-07-24 10:45:15
【问题描述】:

下面是我的数据框df,它有3个变量和大约10万个数据点,

   ID   A   B   C
   1    35  0   0
   2    28  0   0
   3    36  0   0
   4    99  0   0 
   5    25  1   0
   6    65  1   0
   7    98  1   0
   8    95  1   0
   9    67  0   65
  10    95  0   65 
  11    94  0   65
  12    4   0   65
  13    2   -1  0
  14    62  -1  0
  15    95  -1  0
  16    25  -1  0
  17    36  0   19.5
  18    3   0   19.5

现在,我想创建另一个变量D,其中包含A 的最后一个数据点B == 1 or -1C 中的下一个值之间的差异B == 1 or -1

预期输出

    ID  A   B   C      D
     1  35  0   0      0
     2  28  0   0      0
     3  36  0   0      0
     4  99  0   0      0
     5  25  1   0      0
     6  65  1   0      0
     7  98  1   0      0
     8  95  1   0     30
     9  67  0   65     0
    10  95  0   65     0
    11  94  0   65     0
    12  4   0   65     0
    13  2   -1  0      0
    14  62  -1  0      0
    15  95  -1  0      0
    16  25  -1  0    5.5
    17  36  0   19.5    0
    18  3   0   19.5    0

注意
例如。 D8 = A8-c9,类似D16 = A16 - C17,一直持续到数据帧结束。

更新预期输出

    ID  A   B   C       D
     1  35  0   0       0
     2  28  0   0       0
     3  36  0   0       0
     4  99  0   0       0
     5  25  1   0       0
     6  65  1   0       0
     7  98  1   0       0
     8  95  1   0       30
     9  67  0   65      0
    10  95  0   65      0
    11  94  1   65      0
    12  4   0   65      0
    13  2   -1  0       0
    14  62  -1  0       0
    15  95  -1  0       0
    16  25  -1  0      5.5
    17  36  0   19.5    0
    18  3   0   19.5    0  
    19  5   0   19.5    0  
    20  68  1   19.5    0 
    21  17  0   0       0 

更新问题

另一个条件是,如果C 列中的值与接下来的 4 个值相同,则程序不应考虑减去值 AC 例如,B11 ==1 它有变化值为 1,但程序不应考虑该数据点来查找 A11 and C12 之间的差异,因为当 B 发生变化时,C 的值仍在 4 的计数范围内。 B20 处的数据点也是如此。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以试试data.table。将'data.frame'转换为'data.table'(setDT(df1)),shift'C'列得到下一个值('C1'),按'B'的run-length-id分组并指定i (abs(B)==1),我们将'D'指定为'A'和'C1'(A[.N] - C1[.N])的最后一个值之间的差,将不需要的列分配为NULL,并更改'D' 中的值除由分组变量 (rleid(B)) 确定的最后一个元素之外的值为 0

    library(data.table)
    setDT(df1)[, C1 := shift(C, type = 'lead')][abs(B)==1, 
                 D := A[.N] - C1[.N], .(grp = rleid(B))][, C1 := NULL]
    df1[df1[,.I[seq_len(.N) != .N] , rleid(B)]$V1, D := NA][is.na(D), D := 0][]
    #    ID  A  B    C    D
    # 1:  1 35  0  0.0  0.0
    # 2:  2 28  0  0.0  0.0
    # 3:  3 36  0  0.0  0.0
    # 4:  4 99  0  0.0  0.0
    # 5:  5 25  1  0.0  0.0
    # 6:  6 65  1  0.0  0.0
    # 7:  7 98  1  0.0  0.0
    # 8:  8 95  1  0.0 30.0
    # 9:  9 67  0 65.0  0.0
    #10: 10 95  0 65.0  0.0
    #11: 11 94  0 65.0  0.0
    #12: 12  4  0 65.0  0.0
    #13: 13  2 -1  0.0  0.0
    #14: 14 62 -1  0.0  0.0
    #15: 15 95 -1  0.0  0.0
    #16: 16 25 -1  0.0  5.5
    #17: 17 36  0 19.5  0.0
    #18: 18  3  0 19.5  0.0
    

    【讨论】:

    • 我已经更新了我的问题,如果有解决方案请告诉我。
    • @ANmike 您能否将其作为一个新问题发布,因为需要更多更改
    • 当然!我会做的
    【解决方案2】:

    或者你可以尝试使用base R:

      dat$new <- 0
    
      ind <- cumsum(rle(dat$B)$lengths)[rle(dat$B)$values%in%c(1,-1)]
    
      dat[ind,"new"] <- dat[ind,"A"] - lead(dat[,"C"])[ind]
    

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 2021-11-24
      • 2019-10-08
      • 2013-07-12
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多