提问人:CG96 提问时间:9/4/2023 最后编辑:jpsmithCG96 更新时间:9/4/2023 访问量:33
如何在 R 中以不同的方式过滤每个主题的反应时间
How to filter reaction times differently for each subject in R
问:
我想过滤反应时间 (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]的长度不匹配”
答:
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
# ...
如果我们改变以显示这些值,您可以看到它的作用,以及我们是否应该这些值: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)
您也可以在基础 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
评论
?dput