R 根据另一列中的条件查找两列之间的差异
下面是我的数据框df,它有3个变量和大约100k个数据点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
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 < /代码>之间的差异,因为
处的数据点,我们可以尝试使用B20
。将'data.frame'转换为'data.table'(Data.table
),setDT(df1)
将'C'列转换为下一个值('C1'),按运行长度id'B'分组,并指定shift
(i
),我们将'D'指定为'A'和'C1'的最后值之间的差值(abs(B)==1
),将不需要的列指定为NULL,并将“D”中的值更改为0,但分组变量确定的最后一个元素除外(A[.N]-C1[.N]
)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]