如何在 R 中以不同方式过滤每个受试者的反应时间

问题描述 投票:0回答:1

我想过滤反应时间 (RT),丢弃每个受试者的平均值大于 3 SD 的 RT。我使用函数聚合来计算每个参与者的平均值和标准差

aggregate(DB$rt, list(DB$subject), FUN=mean)
aggregate(DB$rt, list(DB$subject), FUN=sd)

但是,由于它是一个列表,当我尝试过滤时

DB_r <- DB %>%
  filter(rt < aggregate(DB$rt, list(DB$subject), FUN=mean)+3*aggregate(DB$rt, list(DB$subject), FUN=sd))

我收到此错误

filter()
中的错误: !计算时出现问题
..1 = rt < ...
。 由
FUN()
中的错误引起: !二元运算符的非数字参数

您知道如何解决这个问题吗?

提前感谢您的任何建议:)

我尝试用 data.matrix 修复它(将列表转换为数字形式),但它不起作用,它说“dims [产品 66] 与对象的长度 [474928] 不匹配”

r list time numeric
1个回答
0
投票

这可能是

dplyr::filter()
中逻辑的一个很好的运用。如果您有这些数据:

set.seed(123)
DB <- data.frame(subject = 1:4,
                 rt = rnbinom(100, mu = 2, size = 1))

您可以轻松地将所有内容组合成一个

filter
语句:

dplyr::filter(DB, rt < mean(rt) + sd(rt) * 3, 
              .by = subject)

#   subject rt
#1        1  1
#2        2  4
#3        3  3
#4        4  6
#5        1  3
#6        2  1
#7        3  4
#8        1  0
#9        2  0
#10       3  2
# ...

如果我们改变以显示

cutoff
值,以及我们是否应该
keep
这些值,您可以看到它在做什么:

dplyr::mutate(DB, cutoff = mean(rt) + sd(rt) * 3,
         keep = rt < mean(rt) + sd(rt) * 3, 
         .by = subject)

#  subject rt    cutoff  keep
#1        1  1  8.252067  TRUE
#2        2  4 12.017286  TRUE
#3        3  3  8.080741  TRUE
#4        4  6  8.951358  TRUE
#5        1  3  8.252067  TRUE
#6        2  1 12.017286  TRUE
#7        3  4  8.080741  TRUE
#8        4  9  8.951358 FALSE
#9        1  0  8.252067  TRUE
#10       2  0 12.017286  TRUE
# ...

注意,之前版本的

dplyr
可能需要使用以下代码:

library(dplyr)

DB %>%
  group_by(subject) %>%
  filter(rt < mean(rt) + sd(rt) * 3)
© www.soinside.com 2019 - 2024. All rights reserved.