我想过滤反应时间 (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] 不匹配”
这可能是
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)