具有多个条件的重复过滤,无循环

时间:2018-08-10 18:51:36

标签: r filter while-loop repeat

我有一个约35000个观测值和24个变量(其中一个是时间序列)的大型数据集,但是我可以总结一下我想使用虹膜实现的目标。

library(tidyverse)

iris.new <- iris %>%
  arrange(Species, Sepal.Length, Sepal.Width) %>%
  group_by(Species)

unwanted <- iris.new %>%
  filter(Sepal.Length > 5 & Sepal.Width==min(Sepal.Width))

while(nrow(unwanted)!=0) {
  iris.new <- iris.new %>%
    arrange(Species, Sepal.Length, Sepal.Width) %>%
    group_by(Species) %>%
    filter(!(Sepal.Length > 5 & Sepal.Width == min(Sepal.Width)))
  unwanted <- iris.new %>%
    filter(Sepal.Length > 5 & Sepal.Width==min(Sepal.Width))
}

我只想过滤Sepal.Length> 5,对于每个物种,它在观察范围内的Sepal.Width最小(setosa和versicolor没有)。当我摆脱第一个时,我重复过滤器以查看是否存在任何过滤器,最后使用“ while”循环为我完成此操作。

有没有不用循环就可以过滤它们的方法?

1 个答案:

答案 0 :(得分:0)

我认为这可以解决问题:

# get minimum Sepal.Width without Sepal.Length > 5
iris_min <- iris %>%
  group_by(Species) %>%
  filter(Sepal.Length <= 5) %>%
  summarize(min_sep_width = min(Sepal.Width))

# check to see that nothing is below our minimum 
#   or equal to it with a Sepal.Length that's too long
iris_new <- iris %>% 
  left_join(iris_min, by = c('Species')) %>%
  filter(min_sep_width < Sepal.Width | 
           (min_sep_width == Sepal.Width & Sepal.Length <= 5)) %>%
  select(-min_sep_width)