我搜索了之前已回答的问题,但尚未构建有效的解决方案。以下是演示数据的情况:
假设我让受试者完成计算机任务,他们会对每个试验做出回应。我最终得到了每个试验的数据,关于他们是否给出了准确的答案以及他们的反应时间是什么:
sub1 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0))
sub2 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0))
sub3 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0))
sub.list <- list(sub1, sub2, sub3)
我创建了一个列表,其中每个元素都是主题数据。
> sub.list
[[1]]
acc RT
1 1 259
2 0 187
3 1 256
4 1 288
5 1 304
6 1 265
7 1 312
8 1 196
9 1 335
10 0 276
[[2]]
acc RT
1 1 215
2 0 325
3 1 290
4 0 297
5 0 281
6 1 294
7 0 289
8 1 252
9 0 364
10 0 241
[[3]]
acc RT
1 0 292
2 0 267
3 0 240
4 1 321
5 1 292
6 0 269
7 1 241
8 1 206
9 1 250
10 1 283
现在来了我的问题。我想为每个主题创建另一个列,该列仅具有用于准确试验的RT,并且之前还有准确的响应。这是一个非 - 工作for-loop以及我最终想要结束的一个例子。
for(i in 1:length(sub.list)){
for(j in 2:nrow(sub.list[[i]])){
if(sub.list[[i]][(j-1), "acc"]==1 & sub.list[[i]][j, "acc"]==1){
sub.list[[i]][j,]$correct.RT <- sub.list[[i]][j, "RT"]
} else {
sub.list[[i]][j,]$correct.RT <- NA
}
}
}
> sub.list
[[1]]
acc RT correctRT
1 1 259 NA
2 0 187 NA
3 1 256 NA
4 1 288 288
5 1 304 304
6 1 265 265
7 1 312 312
8 1 196 196
9 1 335 335
10 0 276 NA
[[2]]
acc RT correctRT
1 1 215 NA
2 0 325 NA
3 1 290 NA
4 0 297 NA
5 0 281 NA
6 1 294 NA
7 0 289 NA
8 1 252 NA
9 0 364 NA
10 0 241 NA
[[3]]
acc RT correctRT
1 0 292 NA
2 0 267 NA
3 0 240 NA
4 1 321 NA
5 1 292 292
6 0 269 NA
7 1 241 NA
8 1 206 206
9 1 250 250
10 1 283 283
我这样做的原因是我可以单独执行这些试验的功能。例如:
> sapply(sub.list, function(x) mean(x$correctRT, na.rm=TRUE))
[1] 283.3333 NaN 257.7500
我知道必须有一种方法可以使用mapply或其他一个应用函数来完成此操作,而不是一个笨拙,缓慢的for循环,但我的挂机是如何引用顺序行。
非常感谢任何帮助!
答案 0 :(得分:4)
sub.list <- lapply(sub.list, transform,
correctRT = ifelse(acc & c(0, head(acc, -1)), RT, NA))
但是考虑到你的最终目标,我宁愿创建一个标志(TRUE / FALSE)变量:
sub.list <- lapply(sub.list, transform,
is.valid = acc & c(0, head(acc, -1)))
然后计算方法,例如:
sapply(sub.list, with, mean(RT[is.valid]))
答案 1 :(得分:2)
您可以使用mutate
包中的plyr
功能来完成此任务
让我们首先重新创建数据并设置seeed以使此示例可重现。
set.seed(123)
sub1 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0),
RT = round(rnorm(10, mean=270, sd=30), 0))
sub2 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0),
RT = round(rnorm(10, mean=270, sd=30), 0))
sub3 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0),
RT = round(rnorm(10, mean=270, sd=30), 0))
sub_list <- list(sub1, sub2, sub3)
现在,我们可以将mutate
函数应用于列表中的每个数据框
require(plyr)
lapply(sub_list, mutate, acclag = c(NA, head(acc, -1)),
correctRT = ifelse((acc == 0 | acclag == 0), NA, RT))
## [[1]]
## acc RT acclag correctRT
## 1 1 307 NA NA
## 2 1 281 1 281
## 3 1 282 1 282
## 4 1 273 1 273
## 5 1 253 1 253
## 6 1 324 1 324
## 7 1 285 1 285
## 8 0 211 1 NA
## 9 0 291 0 NA
## 10 1 256 0 NA
## [[2]]
## acc RT acclag correctRT
## 1 0 283 NA NA
## 2 1 261 0 NA
## 3 0 297 1 NA
## 4 0 296 0 NA
## 5 0 295 0 NA
## 6 0 291 0 NA
## 7 1 287 0 NA
## 8 1 268 1 268
## 9 0 261 1 NA
## 10 1 259 0 NA
## [[3]]
## acc RT acclag correctRT
## 1 0 278 NA NA
## 2 1 269 0 NA
## 3 0 269 1 NA
## 4 1 311 0 NA
## 5 1 263 1 263
## 6 0 315 1 NA
## 7 1 224 0 NA
## 8 1 288 1 288
## 9 1 274 1 274
## 10 1 276 1 276
答案 2 :(得分:2)
lapply(sub.list,
function(x) {
a <- x$acc
# Choose elements which are true, and previous is also true:
b <- a & c(0, a[-length(a)])
x$correctRT <- ifelse(b, x$RT, NA)
x
})