我有一个df,列主题(subj),条件,反应时间(rt_link)。每一行是一次试验。我计算了每个受试者和条件的RTs的均值和标准差:
RTs_overview <- links_RTs %>%
group_by(subj, condition) %>%
summarize(mean_rt = mean(rt_link),
sd_rt = sd(rt_link))
它给出了一个漂亮的df,显示了受试者,条件以及每个RTs的均值和标准差,所以每个受试者有4行,每个条件一个。现在我想把所有的行去掉其中RT等于>或& lt;3sd为相应受试者和条件的平均值。早些时候,我摆脱了与RTs>
links_RTs <- links_cl[links_cl$rt_link < 10, ]
我试着做同样的事,但没有成功
links_RTs[links_RTs$rt_link < (lapply(mean(links4_RTs$rt_link) + 3 * sd(links4_RTs$rt_link))), ]
我也试过没有lapply,但这也不起作用。
如何删除rt_link为>或& lt;从相应的rt-平均值(取决于受试者和条件)得到3sd ?
我的建议是保留原始数据集中的决策标准,然后基于这些标准进行子集:
library(dplyr)
set.seed(99)
# Define raw data
dat <- data.frame(subj = rep(1:25, 8),
condition = rep(c("A","B", "C", "D"), 200),
rt_link = runif(200, 0, 1))
dat %>%
group_by(subj, condition) %>%
mutate(mean_rt = mean(rt_link)) %>%
mutate(sd_rt = sd(rt_link)) %>%
ungroup() %>%
mutate(upr = mean_rt + (sd_rt*3)) %>%
mutate(lwr = mean_rt - (sd_rt*3)) %>%
mutate(remove = ifelse(rt_link > upr | rt_link < lwr, 1, 0))
subj condition rt_link mean_rt sd_rt upr lwr remove
<int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 A 0.585 0.321 0.282 1.17 -0.524 0
2 2 B 0.114 0.462 0.372 1.58 -0.654 0
3 3 C 0.684 0.709 0.0264 0.788 0.630 0
4 4 D 0.993 0.541 0.482 1.99 -0.905 0
5 5 A 0.535 0.582 0.0505 0.734 0.431 0
6 6 B 0.967 0.827 0.149 1.27 0.380 0
7 7 C 0.671 0.508 0.174 1.03 -0.0147 0
8 8 D 0.295 0.442 0.158 0.916 -0.0315 0
9 9 A 0.358 0.249 0.117 0.600 -0.101 0
10 10 B 0.175 0.167 0.00939 0.195 0.138 0
# ... with 790 more rows
然后过滤:
mydat <- dat[dat$remove == 0,]