R 如果满足条件,则向列和上一行添加值

R 如果满足条件,则向列和上一行添加值,r,R,假设我有一个带有这些列的数据帧df RT Error Number 0.2 0 4 0.3 0 4 0.3 1 3 0.4 0 4 0.2 1 3 0.2 0 4 0.3 0 3 我所做的是添加一列,我用它 Df["ThirdColumn"] <- 0 现在我想修改第三列中错误==1和数字==3加8之前的0 第三列中的0位于错误==0和数字==3和9之前 预期结果 RT Error N

假设我有一个带有这些列的数据帧df

RT   Error Number
0.2  0     4
0.3  0     4
0.3  1     3
0.4  0     4
0.2  1     3
0.2  0     4      
0.3  0     3      
我所做的是添加一列,我用它

Df["ThirdColumn"] <- 0
现在我想修改第三列中错误==1和数字==3加8之前的0 第三列中的0位于错误==0和数字==3和9之前

预期结果

RT   Error Number ThirdColumn
0.2  0     4      0
0.3  0     4      8
0.3  1     3      0
0.4  0     4      8
0.2  1     3      0  
0.2  0     4      9
0.3  0     3      0

我尝试了几个if语句,但不断出现错误。

我们可以使用
哪个

library(data.table)
setDT(Df)[which(Error==1 & Number==3)-1, ThirdColumn := 8]
Df[which(Error==0 & Number==3)-1, ThirdColumn := 9]
Df
#    RT Error Number ThirdColumn
#1: 0.2     0      4           0
#2: 0.3     0      4           8
#3: 0.3     1      3           0
#4: 0.4     0      4           8
#5: 0.2     1      3           0
#6: 0.2     0      4           9
#7: 0.3     0      3           0

我们也可以使用
base R

i1 <- with(Df, which(Error ==1 & Number == 3)-1)
i2 <- with(Df, which(Error ==0 & Number == 3)-1)
Df$ThirdColumn[i1] <- 8
Df$ThirdColumn[i2] <- 9

i1哪些行符合标准

> W = which((Df$Error==1 | Df$Error==0) & Df$Number==3)
现在设置行
W-1
中的值,并使用
9-Df$Error
Error
为0时获得9,在
Error
为1时获得8:

> Df$ThirdColumn[W-1] = 9-Df$Error[W]
> 
> Df
   RT Error Number ThirdColumn
1 0.2     0      4           0
2 0.3     0      4           8
3 0.3     1      3           0
4 0.4     0      4           8
5 0.2     1      3           0
6 0.2     0      4           9
7 0.3     0      3           0

我们可以使用
dplyr
中的
lead
来获取列的前导值

library(dplyr)
Df$ThirdColumn <- with(Df, ifelse(lead(Error) == 1 & lead(Number == 3), 8, 
                           ifelse(lead(Error) == 0 & lead(Number) == 3, 9, 0)))

谢谢你akrun我会尝试一下,如果它有效的话,我会回来投票的。有一个很好的答案。谢谢你,我对你的答案投了赞成票,虽然stack没有考虑,因为我的帐户是新的,在我看来,这个答案是其他答案中最容易理解的。
library(dplyr)
Df$ThirdColumn <- with(Df, ifelse(lead(Error) == 1 & lead(Number == 3), 8, 
                           ifelse(lead(Error) == 0 & lead(Number) == 3, 9, 0)))
Df$ThirdColumn[nrow(Df)] <- 0

Df
#   RT Error Number ThirdColumn
#1 0.2     0      4           0
#2 0.3     0      4           8
#3 0.3     1      3           0
#4 0.4     0      4           8
#5 0.2     1      3           0
#6 0.2     0      4           9
#7 0.3     0      3           0