如何删除数据框子集中的行

时间:2018-07-17 13:03:12

标签: r dataframe indexing subset

我正在过滤数据进行分析,偶然发现一个我找不到解决方案的问题。我确实研究了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), ] 
}

1 个答案:

答案 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行。这是您对异常值的定义。