Я новичок в R, поэтому прошу прощения за ошибки и спасибо за помощь.
У меня есть набор данных (печень), где строки представляют собой идентификационные номера пациентов, а столбцы включают регион, в котором проживает пациент (Лондон, Йоркшир и т. д.), и в каком отделении пациент лечился (название больницы). Некоторые подразделения являются частными подразделениями. Я выявил 120 пациентов из Лондона, 100 из которых лечились в трех частных отделениях. Я хочу удалить 100 лондонских пациентов, лечившихся в частных отделениях, но я продолжаю случайно удалять всех пациентов, лечившихся в частных отделениях (около 900 пациентов). Буду признателен за совет, как просто убрать лондонских больных, лечившихся частным образом.
Я пробовал различные комбинации использования подмножества и фильтра с разными восклицательными знаками и скобками в разных местах, включая, например:
liver <- filter(liver, region_name != "London" & unit_name! = "Primrose Hospital" & unit_name != "Oak Hospital" & unit_name != "Wilson Hospital")
Большое спасибо.
Ваше unit_name
состояние обнуляет ваши результаты. Попробуйте использовать функцию match
, которая чаще встречается в инфиксной форме %in%
:
liver <- filter(liver,
region_name != "London",
! unit_name %in% c("Primrose Hospital",
"Oak Hospital",
"Wilson Hospital"))
Также вы можете разделить логические условия И с помощью запятой.
Основываясь на отличном старте Парикшита (по-прежнему принимает пациентов частных больниц за пределами Лондона). Здесь нам нужно использовать оператор ИЛИ |
в функции фильтра. Я сделал пример фрейма данных, который демонстрирует, как это работает для вашего случая. Таблица примеров содержит три ваши частные лондонские больницы и одну нечастную больницу, которую мы хотим сохранить. Кроме того, у него есть пациенты из Манчестера, которые посещают и Мэнч, и одну из частных больниц, и всех их мы хотим сохранить.
EDITED: теперь включает векторы символов, чтобы исключить обобщение комбинаций.
liver <- tibble(region_name = rep(c('London', 'Liverpool', 'Glasgow', 'Manchester'), each = 4),
unit_name = c(rep(c('Primrose Hospital',
'Oak Hospital',
'Wilson Hospital',
'State Hospital'), times = 3),
rep(c('Manch General', 'Primrose Hospital'), each = 2)))
liver
# A tibble: 16 x 2
region_name unit_name
<chr> <chr>
1 London Primrose Hospital
2 London Oak Hospital
3 London Wilson Hospital
4 London State Hospital
5 Liverpool Primrose Hospital
6 Liverpool Oak Hospital
7 Liverpool Wilson Hospital
8 Liverpool State Hospital
9 Glasgow Primrose Hospital
10 Glasgow Oak Hospital
11 Glasgow Wilson Hospital
12 Glasgow State Hospital
13 Manchester Manch General
14 Manchester Manch General
15 Manchester Primrose Hospital
16 Manchester Primrose Hospital
excl.private.regions <- c('London',
'Liverpool',
'Glasgow')
excl.private.hospitals <- c('Primrose Hospital',
'Oak Hospital',
'Wilson Hospital')
liver %>%
filter(! region_name %in% excl.private.regions |
! unit_name %in% excl.private.hospitals)
# A tibble: 7 x 2
region_name unit_name
<chr> <chr>
1 London State Hospital
2 Liverpool State Hospital
3 Glasgow State Hospital
4 Manchester Manch General
5 Manchester Manch General
6 Manchester Primrose Hospital
7 Manchester Primrose Hospital
Большое спасибо, это сработало! Извините, если это уже есть в вашем ответе, но если бы я хотел исключить, скажем, всех пациентов из Лондона, Ливерпуля и Глазго, которые обращались к частным поставщикам, но оставить всех государственных пациентов и всех пациентов Манчестера, будь то государственные или частные, как бы я изменил первую строку? кода? Спасибо!
Без проблем! Я обновил свой ответ, включив в него общие переменные, которые вы можете использовать в качестве списка исключенных регионов / больниц, поэтому, надеюсь, вы сможете применить это непосредственно к своей проблеме :)
Попробуйте
liverSubset <- liver[ liver$region_name != "London" & !liver$unit_name %in% c("Primrose Hospital", "Oak Hospital", "Wilson Hospital"), ]