r-我如何计算一个forloop,它将在不替换当前值的情况下更新我的列向量



我正在进行for循环,以计算错误后的速度减慢。基本上,如果参与者的试用不正确(key_resp_corr = 0(,我想看看他们是否在下一次试用中放慢了速度(即,下一次试验的key_resp.rt减去当前试验的key.resp.rt。

以下是一些示例数据的代码(称为MixedRSI(:

structure(list(X = 25:35, display = c("HHHHH", "HHHHH", "HHHHH", 
"SSSSS", "HHSHH", "SSSSS", "HHHHH", "SSHSS", "SSSSS", "HHHHH", 
"SSSSS"), correctAns = c("z", "z", "z", "slash", "slash", "slash", 
"z", "z", "slash", "z", "slash"), RSI = c(0.6, 1.4, 1.3, 0.8, 
0.7, 0.8, 0.8, 0.6, 0.8, 1.2, 0.6), key = c("z", "z", "z", "slash", 
"z", "slash", "z", "z", "slash", "z", "slash"), key_resp_corr = c(1L, 
1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L), key_resp.rt = c(0.796000004, 
1.430000067, 1.462999821, 0.946999788, 0.881000042, 1.263999939, 
1.113000154, 0.812999964, 0.897000074, 1.364000082, 0.697000027
), Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Block = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Condition = c("Mixed", 
"Mixed", "Mixed", "Mixed", "Mixed", "Mixed", "Mixed", "Mixed", 
"Mixed", "Mixed", "Mixed"), PES = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0)), row.names = 25:35, class = "data.frame")

以下是我尝试过的:

ntrials <- (nrow(MixedRSI)-1)
MixedRSI$PES <- 0
for (i in ntrials) {
MixedRSI$PES[i] <-
ifelse(
MixedRSI$key_resp_corr[i] == 0,
yes = (MixedRSI$key_resp.rt[i+1] - MixedRSI$key_resp.rt[i]),
no  =  MixedRSI$PES[i])
}

问题是,它没有在应该更新的时候用正确的值更新PES列——它只是让它为零。我很困惑,因为当我在i = 4时单独运行ifelse语句时,它似乎工作得很好。我这里缺什么了吗?当i = 4时,它是否以某种方式覆盖了我的条目?

这里没有循环:

check <- df$key_resp_corr == 0
diffs <- diff(df$key_resp.rt)
diffs <- c(diffs, 0)
newPES <- check * diffs
newPES <- ifelse(newPES > 0, 1, 0)
df$PES <- newPES
df
X display correctAns RSI   key key_resp_corr key_resp.rt Subject Block Condition PES
25 25   HHHHH          z 0.6     z             1   0.7960000       1     1     Mixed   0
26 26   HHHHH          z 1.4     z             1   1.4300001       1     1     Mixed   0
27 27   HHHHH          z 1.3     z             1   1.4629998       1     1     Mixed   0
28 28   SSSSS      slash 0.8 slash             1   0.9469998       1     1     Mixed   0
29 29   HHSHH      slash 0.7     z             0   0.8810000       1     1     Mixed   1
30 30   SSSSS      slash 0.8 slash             1   1.2639999       1     1     Mixed   0
31 31   HHHHH          z 0.8     z             1   1.1130002       1     1     Mixed   0
32 32   SSHSS          z 0.6     z             1   0.8130000       1     1     Mixed   0
33 33   SSSSS      slash 0.8 slash             1   0.8970001       1     1     Mixed   0
34 34   HHHHH          z 1.2     z             1   1.3640001       1     1     Mixed   0
35 35   SSSSS      slash 0.6 slash             1   0.6970000       1     1     Mixed   0

如果这不是你想要的,请回复。或者请抬头查看答案。

这里有一个dplyr解决方案:

MixedRSI <- structure(list(X = 25:35, 
display = c("HHHHH", "HHHHH", "HHHHH", 
"SSSSS", "HHSHH", "SSSSS", "HHHHH", "SSHSS", "SSSSS", "HHHHH", 
"SSSSS"), correctAns = c("z", "z", "z", "slash", "slash", "slash", 
"z", "z", "slash", "z", "slash"), RSI = c(0.6, 1.4, 1.3, 0.8, 
0.7, 0.8, 0.8, 0.6, 0.8, 1.2, 0.6), key = c("z", "z", "z", "slash", 
"z", "slash", "z", "z", "slash", "z", "slash"), key_resp_corr = c(1L, 
1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L), key_resp.rt = c(0.796000004, 
1.430000067, 1.462999821, 0.946999788, 0.881000042, 1.263999939, 
1.113000154, 0.812999964, 0.897000074, 1.364000082, 0.697000027), 
Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Block = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Condition = c("Mixed", 
"Mixed", "Mixed", "Mixed", "Mixed", "Mixed", "Mixed", "Mixed", 
"Mixed", "Mixed", "Mixed"), PES = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0)), row.names = 25:35, class = "data.frame")
#dplyr solution
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
MixedRSI %>% 
mutate(PES = case_when(
key_resp_corr == 0 ~ lag(key_resp.rt) - key_resp.rt,
T ~ 0
))
#>     X display correctAns RSI   key key_resp_corr key_resp.rt Subject Block
#> 1  25   HHHHH          z 0.6     z             1   0.7960000       1     1
#> 2  26   HHHHH          z 1.4     z             1   1.4300001       1     1
#> 3  27   HHHHH          z 1.3     z             1   1.4629998       1     1
#> 4  28   SSSSS      slash 0.8 slash             1   0.9469998       1     1
#> 5  29   HHSHH      slash 0.7     z             0   0.8810000       1     1
#> 6  30   SSSSS      slash 0.8 slash             1   1.2639999       1     1
#> 7  31   HHHHH          z 0.8     z             1   1.1130002       1     1
#> 8  32   SSHSS          z 0.6     z             1   0.8130000       1     1
#> 9  33   SSSSS      slash 0.8 slash             1   0.8970001       1     1
#> 10 34   HHHHH          z 1.2     z             1   1.3640001       1     1
#> 11 35   SSSSS      slash 0.6 slash             1   0.6970000       1     1
#>    Condition        PES
#> 1      Mixed 0.00000000
#> 2      Mixed 0.00000000
#> 3      Mixed 0.00000000
#> 4      Mixed 0.00000000
#> 5      Mixed 0.06599975
#> 6      Mixed 0.00000000
#> 7      Mixed 0.00000000
#> 8      Mixed 0.00000000
#> 9      Mixed 0.00000000
#> 10     Mixed 0.00000000
#> 11     Mixed 0.00000000

由reprex包(v0.3.0(创建于2020-12-08

最新更新