R: если записи совпадают по определенным c столбцам, но отличаются друг от друга, удалите строку, в которой другое значение - NA - PullRequest
0 голосов
/ 25 мая 2020

У меня есть набор данных, и я хочу удалить строки с одинаковыми идентификаторами пациента, лекарствами, дозировками и датой начала, но у одного есть дата окончания, а у другого нет. Я хотел бы удалить строку с NA End.date.

ID      First.name Last.name Report.year  Medication   Dosage Start.date   End.date
1       John       Doe        2013 Modulator A Dosage 1 2013-01-01       <NA>
1       John       Doe        2013 Modulator A Dosage 2 2013-01-01       <NA>
1       John       Doe        2016 Modulator B Dosage 1 2016-01-01       <NA>****REMOVE
1       John       Doe        2018 Modulator B Dosage 1 2016-01-01 2018-12-31 
1       John       Doe        2019 Modulator C     <NA> 2019-01-01       <NA>****REMOVE
1       John       Doe        2020 Modulator C Dosage 1 2019-01-01       <NA>       
1       John       Doe        2021 Modulator C     <NA> 2019-01-01 2021-12-31

Окончательный результат должен быть:

ID      First.name Last.name Report.year  Medication   Dosage Start.date   End.date
1       John       Doe        2013 Modulator A Dosage 1 2013-01-01       <NA>
1       John       Doe        2013 Modulator A Dosage 2 2013-01-01       <NA>
1       John       Doe        2018 Modulator B Dosage 1 2016-01-01 2018-12-31 
1       John       Doe        2020 Modulator C Dosage 1 2019-01-01       <NA>       
1       John       Doe        2021 Modulator C     <NA> 2019-01-01 2021-12-31

Я пробовал следующий код, но он удаляет все даты окончания все вместе.

data %>%
  group_by(Patient.ID, Medication, Dosage, Start.date) %>%
  filter(n_distinct(End.date)==1) %>%
  distinct()

1 Ответ

1 голос
/ 25 мая 2020

в Base-R. Это изменяет порядок данных, чтобы гарантировать сохранение строк с End.dates! = NA. c(1,5,6,7) определяет, какие столбцы вы хотите проверить на дублирование.

df <- df[order(df$End.date),]
df[!duplicated(apply(df[,c(1,5,6,7)],1,data.frame)),]

  ID First.name Last.name Report.year Medication  Dosage Start.date   End.date
4  1       John       Doe        2018 ModulatorB Dosage1 2016-01-01 2018-12-31
7  1       John       Doe        2021 ModulatorC    <NA> 2019-01-01 2021-12-31
1  1       John       Doe        2013 ModulatorA Dosage1 2013-01-01       <NA>
2  1       John       Doe        2013 ModulatorA Dosage2 2013-01-01       <NA>
6  1       John       Doe        2020 ModulatorC Dosage1 2019-01-01       <NA>

пример данных:

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L), First.name = c("John", 
"John", "John", "John", "John", "John", "John"), Last.name = c("Doe", 
"Doe", "Doe", "Doe", "Doe", "Doe", "Doe"), Report.year = c(2018L, 
2021L, 2013L, 2013L, 2016L, 2019L, 2020L), Medication = c("ModulatorB", 
"ModulatorC", "ModulatorA", "ModulatorA", "ModulatorB", "ModulatorC", 
"ModulatorC"), Dosage = c("Dosage1", NA, "Dosage1", "Dosage2", 
"Dosage1", NA, "Dosage1"), Start.date = c("2016-01-01", "2019-01-01", 
"2013-01-01", "2013-01-01", "2016-01-01", "2019-01-01", "2019-01-01"
), End.date = c("2018-12-31", "2021-12-31", NA, NA, NA, NA, NA
)), row.names = c(4L, 7L, 1L, 2L, 3L, 5L, 6L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...