Установите переменную в NA, если другие переменные являются дубликатами в R - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть следующий фрейм данных, содержащий код лекарства в зависимости от пути введения:

code <- data.frame(inn = c("ibuprofen", "ibuprofen", "ibuprofen", "fusidic acid", "fusidic acid"),
                   route = c("unknown", "unknown", "unknown", "oral", "topical"),
                   atc = c("R02AX02", "G02CC01", "M01AE01", "J01XC01", "D06AX01"))

           inn   route     atc
1    ibuprofen unknown R02AX02
2    ibuprofen unknown G02CC01
3    ibuprofen unknown M01AE01
4 fusidic acid    oral J01XC01
5 fusidic acid topical D06AX01

И еще один, содержащий лечение пациента и событие:

event <- data.frame(id = c(1, 1, 2),
                    inn = c("ibuprofen", "fusidic acid", "fusidic acid"),
                    route = c("unknown", "oral", "topical"),
                    event = c(TRUE, FALSE, TRUE))

  id          inn   route event
1  1    ibuprofen unknown  TRUE
2  1 fusidic acid    oral FALSE
3  2 fusidic acid topical  TRUE

Мне нужно объединитьэти кадры данных, чтобы получить следующий результат:

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE NA

Я не получаю этот результат с простым merge:

merge(x = event,
      y = code)

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE R02AX02
4    ibuprofen unknown  1  TRUE G02CC01
5    ibuprofen unknown  1  TRUE M01AE01

Я думал о двух решениях, но я не сделалудается реализовать любое:

  • изменить кадр данных code перед merge, чтобы установить atc на NA, если есть разные atc для группы inn иroute (это кажется более уместным)
  • изменить результат merge для установки atc на NA, если есть разные atc для группы inn, route иid

Как я могу сделать это в базе R?Есть ли другой лучший способ?Я работаю в ограничительной среде, где у меня есть доступ только к базе R.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2019

Код для дела 2:

code$inn_route <- paste0(code$inn,'_',code$route)
code$count <- table(code$inn_route)[code$inn_route]
code[code$count>1,3]<-NA
code$inn_route <- NULL
code$count <- NULL
code <- unique(code)
merge(event,code)


           inn   route id event   atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE    <NA>
1 голос
/ 25 апреля 2019

Вот простой способ выполнить вариант 2. Начиная с результата простого слияния:

mrg <- merge(x = event,
             y = code)

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE R02AX02
4    ibuprofen unknown  1  TRUE G02CC01
5    ibuprofen unknown  1  TRUE M01AE01

Затем мы проверяем, какие строки дублируются (отбрасывая переменную atc).Нам нужно использовать дубликат дважды, потому что он на самом деле находит дубликаты строк, а не строки, которые имеют дубликаты.Таким образом, он будет ловить строки 4 и 5, но не 3 - чтобы получить это, нам нужно повторить duplicated в противоположном направлении.Подробнее здесь: Поиск ВСЕХ дублирующих строк, включая «элементы с меньшими индексами» :

mrg$atc <- ifelse(duplicated(mrg[,-5]) | duplicated(mrg[,-5], fromLast = T),
                  NA,
                  mrg$atc)
mrg

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE    <NA>
4    ibuprofen unknown  1  TRUE    <NA>
5    ibuprofen unknown  1  TRUE    <NA>

Если вы хотите избавиться от дублирующих строк 4 и 5, просто запустите duplicated еще раз, чтобы отбросить их:

mrg[!duplicated(mrg),]

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE    <NA>
0 голосов
/ 06 апреля 2019

Ответ Гжегожа Сионковского привел меня к следующему решению:

code$atc <- as.character(x = code$atc)

code$atc <- ifelse(test = ave(x = code$atc,
                              code$inn,
                              code$route,
                              FUN = length) > 1,
                   yes = NA,
                   no = code$atc)

code <- unique(x = code)

merge(x = event,
      y = code)

           inn   route id event     atc
1 fusidic acid    oral  1 FALSE J01XC01
2 fusidic acid topical  2  TRUE D06AX01
3    ibuprofen unknown  1  TRUE    <NA>

Однако, поскольку ave довольно медленно обрабатывает мои реальные данные, мне интересно, есть ли более быстрый метод с базовым R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...