R 如何筛选具有多个条件的行?

R 如何筛选具有多个条件的行?,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一个如下所示的数据集 df <- tribble( ~shop_id, ~id, ~key, ~date, ~status, "1", "10", "abc", '2020-05-04', 'good', "1", "10", "def", '2020-05-03', 'normal', "1", "10", "glm", '2020-05-03'

我有一个如下所示的数据集

df <- tribble(
  ~shop_id,  ~id,      ~key,        ~date,      ~status, 
  "1",       "10",     "abc",    '2020-05-04',   'good',
  "1",       "10",     "def",    '2020-05-03',   'normal',
  "1",       "10",     "glm",    '2020-05-03',   'bad',
  "1",       "20",     "ksr",    '2020-05-01',   'bad',
  "1",       "20",     "tyz",    '2020-05-02',   'bad',
  "2",       "20",     "uyv",    '2020-05-01',   'good',
  "2",       "20",     "mys",    '2020-05-01',   'normal',
  "2",       "30",     "ert",    '2020-05-01',   'bad',
  "2",       "40",     "yer",    '2020-05-05',   'good',
  "2",       "40",     "tet",    '2020-05-05',   'bad',
)
任何帮助都将不胜感激

一种方法是在需要时使用case\u


根据你的解释,我不明白为什么第一行被删除了。它的状态不错,日期也不是最短的。请您澄清一下,因为当店铺id='1'和id='10'时,最短日期属于“坏”状态。这就是我们删除前三行的原因。现在清楚了吗@Amitkohli 1和10怎么一样?对不起,我刚刚更正了我的句子@Edward谢谢你的评论!对于最后一个标准,当shop_id='2'和id='40'时,只有一个日期是'2020-05-05',状态为'good'和'bad'。这就是为什么我想保留这两行,因为我不能比较日期@Ian Campbelline shop_id=='2',id=='40'应该被规则删除,如果日期是status=='bad'时的最小日期,则删除行。是的,很抱歉我的英语不好。为了避免这种误解,我添加了第三个条件。因为在行shop_id='2'&id='40'中,我们的状态“good”的日期也相同。我希望我能有“小时”的约会,但我没有。这就是为什么我保留了这两个。为什么要删除line shop_id='2'和id='20'?没有专门删除它的规则。因为此行没有“坏”状态,所以在“坏”状态上也没有比较点。想象一下,坏意味着删除状态。我基本上希望看到那些永远不会回到数据中的行。如果没有“坏”状态,则表示该状态从未被删除。

desired_df <- tribble(
  ~shop_id,  ~id,      ~key,      ~date,      ~status, 
  "1",       "20",     "ksr",   '2020-05-01',   'bad',
  "1",       "20",     "tyz",   '2020-05-02',   'bad',
  "2",       "30",     "ert",   '2020-05-01',   'bad',
  "2",       "40",     "yer",   '2020-05-05',   'good',
  "2",       "40",     "tet",   '2020-05-05',   'bad', 
)
df %>%
  mutate(date = ymd(date)) %>%
  group_by(shop_id,id) %>% 
  mutate(filter = case_when(all(status != "bad") ~ FALSE,
                            all(status == "bad") ~ TRUE,
                            all(status[date == min(date)] == "bad") ~ FALSE,
                            any(status[date == min(date)] == "good") ~ TRUE,
                            TRUE ~ FALSE)) %>%
  filter(filter == TRUE) %>% 
  dplyr::select(-filter)

# A tibble: 5 x 5
# Groups:   shop_id, id [3]
  shop_id id    key   date       status
  <chr>   <chr> <chr> <date>     <chr> 
1 1       20    ksr   2020-05-01 bad   
2 1       20    tyz   2020-05-02 bad   
3 2       30    ert   2020-05-01 bad   
4 2       40    yer   2020-05-05 good  
5 2       40    tet   2020-05-05 bad