Как фильтровать на основе строк

Вот представление моей базы данных

ID<-1:10
CityCode<-c("AA","BB","BB","CC","CC","CC","DD","DD","DD","DD")
strPostcode<-c("01",rep("10_11",2),rep("20_21_22",3),rep("30_31_32_33",4))
HospitalCode<-c("04","05","10","20","21","33","34","65","22","03")

mydata<-data.frame(ID,CityCode,strPostcode, HospitalCode)

Это немного предыстории. У меня есть географическое происхождение пациентов (коды городов и соответствующие почтовые индексы: 2 первых столбца) и географическое расположение больниц (HospitalCode), в которых они лечатся. Я хотел бы отфильтровать эту базу данных по больницам. Города обозначаются кодами городов и всеми почтовыми индексами (разделенными тире), связанными с городом. С другой стороны, больница обозначается только почтовым индексом. Я бы не смог напрямую связать город с больницей. Но если код больницы находится в строке кода города (столбец = strPostcode), это означает, что больница принадлежит городу. Итак, я хочу отфильтровать только больницы в городе CC (то есть больницу с кодом 20, 21 или 22), чтобы иметь эту таблицу:

 ID CityCode strPostcode HospitalCode

1   4       CC    20_21_22           20
2   5       CC    20_21_22           21
3   9       DD 30_31_32_33           22

Затем я хочу отфильтровать больницы 4 городов AA BB CC и DD (это весь больничный код в этой группе строк кодов, разделенных _: 01, 10_11, 20_21_22, 30_31_32_33). Обычно это дает мне следующую таблицу ниже, поскольку больницы с почтовыми индексами: 04, 05, 34, 65, 03 не принадлежат ни к одному из четырех городов.

 ID CityCode strPostcode HospitalCode

3   3       BB       10_11           10
4   4       CC    20_21_22           20
5   5       CC    20_21_22           21
6   6       CC    20_21_22           33
9   9       DD 30_31_32_33           22

NB: В моей реальной базе данных есть сотни и тысячи больниц и городов. Я должен автоматизировать специально для выбора всех больниц всех городов.


person Seydou GORO    schedule 07.08.2020    source источник
comment
Попробуйте subset(mydata, HospitalCode %in% c('20', '21', '22'))   -  person akrun    schedule 08.08.2020
comment
Ваш второй случай не ясен   -  person akrun    schedule 08.08.2020
comment
HospitalCode 22 не находится в DD, поскольку DD имеет 30_31_32_33; аналогично HospitalCode 33 не в CC. Так что второй случай не имеет смысла...   -  person Ben Toh    schedule 08.08.2020
comment
strPostcode указывает место жительства пациента, но пациент может лечиться в больнице в другом городе. С другой стороны, моя цель - выбрать все больницы, расположенные в одном из городов (например, код 22 в CC), зная, что в моей базе данных могут быть десятки городов.   -  person Seydou GORO    schedule 08.08.2020


Ответы (1)


Сначала вы хотите иметь набор данных города. Мой пример будет основан на пакетах dplyr и tidyr.

city_data <- mydata %>%
  select(CityCode, strPostcode) %>%
  distinct
city_data

Это даст вам уникальный набор кодов городов и их почтовых индексов:

  CityCode strPostcode
1       AA          01
2       BB       10_11
3       CC    20_21_22
4       DD 30_31_32_33

Затем вы хотите выделить почтовые индексы. Функция separate_rows отделяет strPostcode и переводит ваш фрейм данных в длинную форму.

city_data2 <- hosp_data %>%
  tidyr::separate_rows(strPostcode)
city_data2

   CityCode strPostcode
1        AA          01
2        BB          10
3        BB          11
4        CC          20
5        CC          21
6        CC          22
7        DD          30
8        DD          31
9        DD          32
10       DD          33

Теперь предположим, что вы хотите, чтобы все пациенты с HospitalCodes были связаны с городом CC. Сначала вы фильтруете только CC строк в city_data2, затем проверяете, какие HospitalCode находятся в этих strPostcode:

CC_codes <- city_data2 %>%
  filter(CityCode == 'CC')

mydata %>%
  filter(HospitalCode %in% CC_codes$strPostcode)

  ID CityCode strPostcode HospitalCode
1  4       CC    20_21_22           20
2  5       CC    20_21_22           21
3  9       DD 30_31_32_33           22

Аналогично для всех AA, BB, CC и DD (не нужно фильтровать, так как city_data2 содержит только эти 4 города):

mydata %>%
  filter(HospitalCode %in% city_data2$strPostcode)

  ID CityCode strPostcode HospitalCode
1  3       BB       10_11           10
2  4       CC    20_21_22           20
3  5       CC    20_21_22           21
4  6       CC    20_21_22           33
5  9       DD 30_31_32_33           22
person Ben Toh    schedule 07.08.2020
comment
Спасибо. Это именно то, что я хотел бы сделать - person Seydou GORO; 08.08.2020