dplyr中奇怪的过滤器行为

3

考虑以下数据集

为什么在进行以下操作时会得到不同的结果:

library(dplyr)
df %>% 
  filter(!(w >= 1 | lag(w >= 1, default = F))) %>% 
  filter(lag(t, default = T) != t) %>%
  summarise(median = median(r), mad = mad(r))

这将导致:

  median      mad
1    664 142.3296

并且
df %>% 
  filter(!(w >= 1 | lag(w >= 1, default = F)), 
         lag(t, default = T) != t) %>%
  summarise(median = median(r), mad = mad(r))

这将会得到:

  median      mad
1    671 152.7078

3
我猜在第一个情况下,第二个过滤器是在已经过滤过的数据上起作用,但是在第二个情况下,lag(t, default=T)是在原始数据集上运行的。因此,你分别得到了8997行。 - akrun
4
过滤观测数据的两种不同方法会得到不同的数据框,用于计算中位数和 MAD。%>%应当阅读为“然后”。因此,在第一种情况下,您使用第一个条件进行过滤 filter(!(w >= 1 | lag(w >= 1, default = F))),过滤掉与筛选条件不匹配的所有内容,然后再筛选第二个条件。而在第二种情况下,则是一个大的筛选条件。 - kristang
1个回答

3
请参考上方的评论以及:http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

filter()允许您选择数据框中某些行。

...

filter()subset()类似,但您可以给它任意多个过滤条件,并使用&将它们连接在一起(不是容易误用的&&!)。 您可以明确使用其他布尔运算符: filter(flights, month == 1 | month == 2)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接