Вы также можете сделать:
library(dplyr)
df %>%
group_by(Invoice) %>%
mutate(Cancellation = +(any(Status == 'Cancelled'))) %>%
split(., .$Cancellation) %>%
setNames(., c("NoCancellations", "Cancellations")) %>%
list2env(., .GlobalEnv)
Это приведет к созданию в вашей среде 2 новых фреймов данных с именами NoCancellations
и Cancellations
(вы можете переименовать их по своему желанию).
NoCancellations
# A tibble: 3 x 5
# Groups: Invoice [2]
Sr Invoice Status Name Cancellation
<int> <chr> <chr> <chr> <int>
1 1 XXX Book AB 0
2 4 ZZZ Book GH 0
3 5 ZZZ Changed GH 0
Cancellations
# A tibble: 2 x 5
# Groups: Invoice [1]
Sr Invoice Status Name Cancellation
<int> <chr> <chr> <chr> <int>
1 2 YYY Book DE 1
2 3 YYY Cancelled DE 1
Новые фреймы данных также будут содержать столбец с именем Cancellation
, который использовался для разделения;Вы можете удалить это, если необходимо, например:
df %>%
group_by(Invoice) %>%
mutate(Cancellation = +(any(Status == 'Cancelled'))) %>%
split(., .$Cancellation) %>%
lapply(., function(x) { x["Cancellation"] <- NULL; x }) %>%
setNames(., c("NoCancellations", "Cancellations")) %>%
list2env(., .GlobalEnv)
Вместо lapply
, вы также можете использовать purrr::map(., ~ (.x %>% select(-Cancellation)))
в этой строке.