Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据另一列中的条件查找两列之间的差异_R_Dataframe - Fatal编程技术网

R 根据另一列中的条件查找两列之间的差异

R 根据另一列中的条件查找两列之间的差异,r,dataframe,R,Dataframe,下面是我的数据框df,它有3个变量和大约100k个数据点 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

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

   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或-1
C
中的下一个值
B==1或-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值相同,则程序不应考虑减去值<代码> A<代码> >代码> C<代码>代码><代码> B11==1 < /代码>它的值变化为1,但是程序不应该考虑数据点来查找<代码> A11和C12 < /代码>之间的差异,因为 b>代码> > <>代码> b>代码>时,代码的值仍在4以内。同样地,对于

B20
处的数据点,我们可以尝试使用
Data.table
。将'data.frame'转换为'data.table'(
setDT(df1)
),
shift
将'C'列转换为下一个值('C1'),按运行长度id'B'分组,并指定
i
abs(B)==1
),我们将'D'指定为'A'和'C1'的最后值之间的差值(
A[.N]-C1[.N]
),将不需要的列指定为NULL,并将“D”中的值更改为0,但分组变量确定的最后一个元素除外(
rleid(B)


或者使用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]

dat$new我已经更新了我的问题,请告诉我是否有解决方案。@ANmike你能把它作为一个新问题发布吗,因为需要更多的更改!,我会做的
  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]