Предположим, у меня есть отметка с переменной группировки и логическая переменная, которая указывает, является ли строка основным ответом для этой группы.
Я хочу сделать следующее:
- Если какая-либо строка в
group
помечена как is_primary
, оставьте эту строку, но ни одна из остальных в группе
- Если ни одна строка в
group
не помечена is_primary
, сохраните их все
- Фильтрация строк на основе вышеупомянутого
Вот некоторые примеры данных:
library(tidyverse)
data <- tibble(group=c("A","A","A","B","B","C","C","C","C"),
is_primary=c(FALSE, FALSE, FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,TRUE),
value=c(1,2,3,4,5,6,7,8,9))
В приведенном выше примере я хотел бы сохранить все строки A
, потому что нет строки с is_primary==TRUE
, оставить только вторую строку B
и оставить последние две строки C
.
Я думал, что очевидное решение будет примерно таким:
data %>%
group_by(group) %>%
mutate(keep_row=ifelse(any(is_primary),is_primary,TRUE))
Но это приводит к следующему, что не соответствует вышеуказанным критериям.
# A tibble: 9 x 4
# Groups: group [3]
group is_primary value keep_row
<chr> <lgl> <dbl> <lgl>
1 A FALSE 1 TRUE
2 A FALSE 2 TRUE
3 A FALSE 3 TRUE
4 B FALSE 4 FALSE
5 B TRUE 5 FALSE
6 C FALSE 6 FALSE
7 C FALSE 7 FALSE
8 C TRUE 8 FALSE
9 C TRUE 9 FALSE
Однако, если я сделаю промежуточную переменную, которая указывает, есть ли у группы первичный ключ, она работает.
data %>%
group_by(group) %>%
mutate(has_primary=ifelse(any(is_primary),TRUE,FALSE)) %>%
mutate(keep_row=ifelse(has_primary,is_primary,TRUE))
В результате keep_row
будет правильным:
# A tibble: 9 x 5
# Groups: group [3]
group is_primary value has_primary keep_row
<chr> <lgl> <dbl> <lgl> <lgl>
1 A FALSE 1 FALSE TRUE
2 A FALSE 2 FALSE TRUE
3 A FALSE 3 FALSE TRUE
4 B FALSE 4 TRUE FALSE
5 B TRUE 5 TRUE TRUE
6 C FALSE 6 TRUE FALSE
7 C FALSE 7 TRUE FALSE
8 C TRUE 8 TRUE TRUE
9 C TRUE 9 TRUE TRUE
Что происходит в ifelse
, когда первое решение не работает?