如何在 R 中以不同的方式过滤每个主题的反应时间

How to filter reaction times differently for each subject in R

提问人:CG96 提问时间:9/4/2023 最后编辑:jpsmithCG96 更新时间:9/4/2023 访问量:33

问:

我想过滤反应时间 (RT),从每个受试者的平均值中丢弃大于 3 个 SD 的 RT。我使用函数聚合为每个参与者提供均值和 sd

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 列表 时间 数字

评论

1赞 I_O 9/4/2023
欢迎来到 StackOverflow,CG96。为了让其他人能够帮助解决您的问题,请提供最少的必要示例数据(请参阅)和预期结果的示例:stackoverflow.com/help/minimal-reproducible-example?dput

答:

0赞 jpsmith 9/4/2023 #1

您可以直接输入逻辑,而无需使用 进行任何额外的处理。如果您有以下数据:dplyr::filter()aggregate

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
# ...

如果我们改变以显示这些值,您可以看到它的作用,以及我们是否应该这些值:cutoffkeep

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)

您也可以在基础 R 中通过以下方式执行此操作:

cutoffs <- aggregate(DB$rt, list(DB$subject), 
                     function(x) mean(x) + sd(x) * 3)

DB[DB$rt < cutoffs$x[match(DB$subject, cutoffs$Group.1)],]

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