Я хотел бы подмножить или отфильтровать некоторые сгруппированные данные в dplyr, чтобы включить только группы, которые имеют 2 разных уровня категориальных данных. Мои данные выглядят так:
И я хотел бы, чтобы мои выходные данные включали только Health_facility, в столбце сезона которых присутствуют как «малярия», так и «не малярия».
я пытался
multi_hf %>%
group_by(health_facility) %>%
filter(season == "malaria" & season == "non-malaria")
Однако я получаю табличку только со значениями NA.
Любая помощь высоко ценится! Данные:
structure(list(season = c("malaria", "malaria", "malaria", "malaria",
"malaria", "malaria", "malaria", "malaria", "malaria", "malaria",
"malaria", "malaria", "malaria", "malaria", "malaria", "malaria",
"malaria", "malaria", "malaria", "malaria", "malaria", "malaria",
"malaria", "malaria", "malaria", "malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria", "non-malaria",
"non-malaria", "non-malaria", "non-malaria", "non-malaria"),
health_facility = c("Hospital Agostinho Neto", "Hospital Baptista de Sousa",
"Health Delegation São Miguel", "Health Center Chã de Alecrim",
"Health Center Fonte Inês", "Health Delegation Maio", "Health Delegation Sao Vincente",
"Health Delegation Sao Vincente", "Hospital Ribeira Grande",
"Health Delegation Ribeira Brava", "Health Delegation Santa Cruz",
"Health Delegation Paul", "Center Delegation Santa Catarina",
"Regional Hospital Fogo e Brava", "Health Delegation São Filipe",
"Health Center Cidade Velha", "Health Delegation Tarrafal Santiago",
"Health Delegation Tarrafal Santiago", "Health Delegation Tarrafal Santiago",
"Health Center Sao Salvador do Mundo – Picos", "Health Delegation Tarrafal Santiago",
"Health Delegation São Lourenço dos Orgaos", "Health Delegation Ribeira Grande",
"Health Delegation of Praia", "Center Delegation Santa Catarina",
"Regional Hospital Santiago Norte", "Health Delegation Ribeira Brava",
"Health Delegation Ribeira Brava", "Hospital Baptista de Sousa",
"Health Delegation Paul", "Health Delegation Ribeira Brava",
"Health Center Sao Salvador do Mundo – Picos", "Health Delegation Sao Vincente",
"Health Delegation São Miguel", "Health Delegation Tarrafal Santiago",
"Regional Hospital Santiago Norte", "Regional Hospital Santiago Norte",
"Regional Hospital Santiago Norte", "Regional Hospital Santiago Norte",
"Health Delegation Sao Vincente", "Regional Hospital Fogo e Brava",
"Center Delegation Santa Catarina", "Health Center Chã de Alecrim",
"Hospital Agostinho Neto", "Hospital Ribeira Grande", "Health Delegation São Lourenço dos Orgaos",
"Health Delegation São Lourenço dos Orgaos", "Health Delegation São Filipe",
"Health Center Fonte Inês", "Hospital Agostinho Neto", "Regional Hospital Fogo e Brava",
"Health Delegation of Praia", "Health Delegation Maio", "Health Delegation Ribeira Grande",
"Health Delegation São Lourenço dos Orgaos", "Health Delegation Santa Cruz",
"Health Center Cidade Velha")), class = c("data.table", "data.frame"
), row.names = c(NA, -57L), .internal.selfref = <pointer: 0x0000017c5a4b1ef0>)
filter(season == "malaria" & season == "non-malaria")
означает, что выбранная строка содержит как «малярию», так и «не малярию», что невозможно, поскольку одна строка может иметь только одно значение. Вот почему вы получаете 0 строк в общих данных образца. В выходных данных образца данных нет строк NA
, но это потому, что он не содержит никаких значений NA
в данных образца. Значение NA
возвращается при сравнении с ==
, если вы используете %in%
, это должно помочь.
Так что, вероятно, вы хотите выбрать health_facility
, который имеет оба значения, которые можно сделать как -
library(dplyr)
multi_hf %>%
arrange(health_facility) %>%
group_by(health_facility) %>%
filter(all(c("malaria", "non-malaria") %in% season)) %>%
ungroup()
Лично я предпочитаю более чистое решение. Здесь очень хорошо подходит использование n_distinct
:
df %>%
group_by(health_facility) %>%
filter(n_distinct(season) == 2) %>%
ungroup()