Автоматизировать замену отсутствующих данных в последовательности переменных с помощью mutate_all - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь автоматизировать процесс, чтобы завершить пропущенные значения в последовательности переменных, используя оператор ifelse и функцию mutate_all. Проблема включает в себя фрейм данных со многими именами переменных, например, ax1, bx1, ... zx1, ax2, bx2, ... zx2, ax3, bx3, ... zx3. Следующие данные дают небольшой сценарий:

df<-data.frame(
  "id"  = c(1:5),
  "ax1" = c(1, "NA", 8, "NA", 17),
  "bx1" = c(2, 7, "NA", 11, 12),
  "ax2" = c(2, 1, 8, 15, 17),
  "bx2" = c(2, 6, 4, 13, 11))

Процесс состоит в том, чтобы заменить отсутствующие значения переменных на конец «x1» их соответствующими значениями переменных на конец «x2». То есть, если отсутствует ax1, он заменяется на ax2, а любое отсутствие на bx1 заменяется на bx2 и так далее. Поскольку есть много переменных, чем сценарий, представленный здесь, я ищу способ автоматизировать этот процесс. Я пробовал следующие коды

library(dplyr)
df <- df %>% 
mutate_all(vars(ends_with("x1", "x2")), function(x,y)
           ifelse(is.na(x), y, x)))

, но это не работает. Я очень ценю любую помощь в этом. Ожидаемый результат -

   id ax1 bx1 ax2 bx2
   1   1   2   2   2
   2   1   7   1   6
   3   8   4   8   4
   4  15  11  15  13
   5  17  12  17  11

1 Ответ

0 голосов
/ 27 февраля 2020

В базе R мы можем заменить NA значение в x1 соответствующими NA значениями в x2, используя Map.

x1_cols <- grep('x1$', names(df))
x2_cols <- grep('x2$', names(df))

df[x1_cols] <- Map(function(x, y) {x[is.na(x)] <- y[is.na(x)];x}, 
                                   df[x1_cols], df[x2_cols])

df
#  id ax1 bx1 ax2 bx2
#1  1   1   2   2   2
#2  2   1   7   1   6
#3  3   8   4   8   4
#4  4  15  11  15  13
#5  5  17  12  17  11

Мы можем использовать то же самое logi c и использовать purrr::map2

df[x1_cols] <- purrr::map2(df[x1_cols], df[x2_cols], 
                      ~{.x[is.na(.x)] <- .y[is.na(.x)];.x})

data

Немного изменил данные, убедившись, что NA являются действительными NA с, а не строкой «NA», которые на самом деле составляли столбцы как факторы.

df<-data.frame(id=c(1:5),
               ax1=c(1,NA,8,NA,17),
               bx1=c(2,7,NA,11,12),
               ax2=c(2,1,8,15,17),
               bx2=c(2,6,4,13,11))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...