我正在过滤数据进行分析,偶然发现一个我找不到解决方案的问题。我确实研究了prepdat软件包,但它似乎不能满足我的需求。 我的数据框(df)包含多个参与者的反应时间,这些反应时间超过4个块。为了过滤异常值,我需要为每个参与者的每个块应用(平均+/- 2.5 sd)规则。
我尝试创建自己的函数,以便将此规则应用于数据框的每个子节(分别针对每个参与者的每个块)。我在下面创建了该函数,因此可以将其与for循环一起使用(此循环在R中可能不是最佳选择,但这不是此处的主要关注点):
append
我无法理解这个索引。对于第一个主题的第一个块,似乎没有问题,该函数将删除右行。但是对于下一个块(和主题),“离群值”也由子集(主题和块)的正确索引组成,我要求在函数中“选择”,但是当我尝试通过它消除行时,看起来索引将应用于整个数据框的索引,而不应用于我在函数中使用的主题和块的特定子集。有什么我想念的东西,或者(尚未)知道要使用吗?还是我的整体思维方式错了??(我仍在适应R)
filter <- function(subject, block){
m <- mean(df[df$subj == subject & df$block == block,3])
stdv<- sd(df[df$subj == subject & df$block == block,3])
lowerbound <- m - 2.5 * stdv
upperbound <- m + 2.5 * stdv
outliers <- which((df[(df$subj == subject & df$block == block),3] <= lowerbound |df[(df$subj == subject & df$block == block),3] >= upperbound)) #Here I retrieve the index for all the rows I need to eliminate
df <<- df[-c(outliers), ]
}
答案 0 :(得分:0)
dplyr
可能更适合在这里使用:
df %>%
group_by(subj, block) %>%
dplyr::summarise(lb = mean(rt) - 2.5 * sd(rt),
ub = mean(rt) + 2.5 * sd(rt)) %>%
inner_join(df, by = c("subj", "block")) %>%
ungroup() %>%
filter(rt > lb & rt < ub)
现在,由于没有定义的异常值,因此将产生相同大小的小标题。如果我将您的定义更改为1.5而不是2.5,那么我们得到20行。这是您对异常值的定义。