gpt4 book ai didi

r - 根据数据框列表中第 N-1 行的值选择第 N 行

转载 作者:行者123 更新时间:2023-12-04 11:12:58 26 4
gpt4 key购买 nike

我已经搜索了以前回答过的问题,但还没有能够构建一个有效的解决方案。这是我的演示数据情况:

假设我让受试者完成一项计算机任务,他们在每次试验中给出回应。我最终从每个试验中得到了关于他们是否给出了准确的 react 以及他们的 react 时间的数据:

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,而且之前也有准确的响应。这是一个 -working 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 循环,但我的问题是如何引用连续行。

任何帮助深表感谢!

最佳答案

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]))

关于r - 根据数据框列表中第 N-1 行的值选择第 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com