Положить два ответа в одном - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь обобщить ответы на вопросы из данных опроса, и многие вопросы записали ответы как 999 или 998, что означает «Не знаю» и «Отказался отвечать» соответственно. Я пытаюсь классифицировать оба из них под одним заголовком («Нет информации»), и назначить это число -999. Я не уверен, как поступить.

1 Ответ

0 голосов
/ 03 октября 2019

Вот подход, использующий dplyr, изменяющий все 998 и 999 во всех столбцах кадра данных на -999. Предполагается, что 998 и 999 не используются как «нормальные» числа в данных, а только для указания пропущенных значений. Но это обычно относится к данным опроса.

# These libraries is needed
library(dplyr)
library(car) # not necessary to call, but has to be installed

# Some test data
data <- data.frame(a = c(1:10, 998),
                   b = c(21:31),
                   c = c(999,31:40))

# a predicate function which checks if a column x contains 998 or 999
check_998_999 <- function (x) {
  any(x == 998) | any(x == 999)
}

# change all columns with 998 or 999 so that they become -999 
data %>% 
  mutate_if(check_998_999,
            ~ car::recode(.x, "c(998,999) = -999"))

Я предпочитаю от car::recode до dplyr::recode, потому что вам нужно быть менее конкретным, и вы можете перекодировать элементы другого класса. Например, вышеприведенное даже работает, когда столбец является символом.

data <- data.frame(a = c(1:10, 998),
                   b = c(21:31),
                   c = c("999",letters[1:10]),
                   stringsAsFactors = F)

data %>% 
  mutate_if(check_998_999,
            ~ car::recode(.x, "c(998,999) = -999"))
...