【发布时间】:2014-10-17 20:05:30
【问题描述】:
在大型数据帧上使用dplyr 时,我经常使用多个过滤参数。通常我可以将这些都包含在一个 filter 参数中。但是,我喜欢 dplyr 允许您逐渐考虑您正在处理数据的方式,因此这些过滤器通常可能位于连续的行上。
但是,通常我不仅希望将这些连续过滤器产生的观察结果保留在新的 df 中,还希望将原始 df 中未包含在单独 df 中的观察结果保留。
例如这个数据集:
set.seed(123)
colors<- c( rep("yellow", 5), rep("blue", 5), rep("green", 5) )
shapes<- c("circle", "star", "oblong")
numbers<-sample(1:15,replace=T)
group<-sample(LETTERS, 15, replace=T)
mydf<-data.frame(colors,shapes,numbers,group)
mydf
colors shapes numbers group
1 yellow circle 5 X
2 yellow star 12 G
3 yellow oblong 7 B
4 yellow circle 14 I
5 yellow star 15 Y
6 blue oblong 1 X
7 blue circle 8 S
8 blue star 14 Q
9 blue oblong 9 Z
10 blue circle 7 R
11 green star 15 S
12 green oblong 7 O
13 green circle 11 P
14 green star 9 H
15 green oblong 2 D
在这里,假设我想按以下规则进行过滤(我知道以不同的顺序过滤可能更有意义,例如先按颜色,但为了论证):
mydf %>%
filter (numbers <= 5 | numbers >= 12) %>%
filter (group=="X" | group =="Y" | group == "Z") %>%
filter (colors=="yellow")
返回:
colors shapes numbers group
1 yellow circle 5 X
2 yellow star 15 Y
我的问题是,我如何才能将过滤器未返回的原始“mydf”中的 13 个观察结果保存到单独的 df 中?有没有可爱的 dplyr 方式?
【问题讨论】:
-
sepDf <- setdiff(mydf, mydf.filtered)? -
anti_join可能有用吗? -
@lukeA - 这两种解决方案都运作良好。我认为 setdiff 稍微好一点,因为它保持行顺序。 - 你能发布一个答案让我打勾吗?