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