преобразовать char в цифру c данные в mutate присваивать переменной фрейма данных - PullRequest
0 голосов
/ 09 марта 2020

Контекст проблемы: замените переменную chr во фрейме данных, сохранив значения chr во фрейме данных, используя mutate case_when для условной проверки (case_when) для определения значения для мутированного результата.

Целью является переменная с именем: length_of_service

условные данные для case_when: «<1 год», «2 года», «3 года», «4 года», «5 лет», «6 лет», «7 лет», « 8 лет "," 9 лет "," 10+ лет "</p>

Код попытки попытки: я могу построить фрейм данных с одной переменной length_of_service, преобразовать строку символов года (ов) в эквивалентную цифру c, затем измените переменную внутри этого фрейма данных, затем cbind () фрейм данных df_length с исходным фреймом данных. Я не буду перезаписывать исходные length_of_services внутри исходного фрейма данных до тех пор, пока не будет выполнено предложение mutate / case_when (). Затем я могу заменить cbind () для объединения фреймов данных. Я приветствую предложения по решению проблемного подхода.

df_length <- data.frame(length_of_service = numeric())
df_length %>% 
   mutate(df$length_of_service == case_when(
          df$length_of_service == "< 1 year" ~ 0.99,
          df$length_of_service == "2 years" ~ 2,
          df$length_of_service == "3 years" ~ 3,
          df$length_of_service == "4 years" ~ 4,
          df$length_of_service == "5 years" ~ 5,
          df$length_of_service == "6 years" ~ 6,
          df$length_of_service == "7 years" ~ 7,
          df$length_of_service == "8 years" ~ 8,
          df$length_of_service == "9 years" ~ 9,
          df$length_of_service == "10+ years" ~ 10,
          TRUE ~ "NA"
   )

Результат / Ошибка:

Ошибка: должен быть двойным вектором, а не символьным вектором

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Базовый раствор R:

years <-
  as.numeric(gsub("[A-Za-z]|[[:punct:]]|\\s+", "", df$length_of_service))

df$length_of_service_new <-
  ifelse(years == 1, .99, ifelse(years > 10, 10, years))

# Data:

df <- data.frame(
  length_of_service =
    c(
      "< 1 year",
      "2 years",
      "3 years",
      "4 years",
      "5 years",
      "6 years",
      "7 years",
      "8 years",
      "9 years",
      "10+ years",
      "11 years"
    )
)
0 голосов
/ 09 марта 2020

case_when ожидает, что значение будет возвращено того же типа, поэтому верните NA_real вместо "NA".

library(dplyr)

df %>% 
  mutate(length_of_service_new = case_when(
             length_of_service == "< 1 year" ~ 0.99,
             length_of_service == "2 years" ~ 2,
             length_of_service == "3 years" ~ 3,
             length_of_service == "4 years" ~ 4,
             length_of_service == "5 years" ~ 5,
             length_of_service == "6 years" ~ 6,
             length_of_service == "7 years" ~ 7,
             length_of_service == "8 years" ~ 8,
             length_of_service == "9 years" ~ 9,
             length_of_service == "10+ years" ~ 10,
             TRUE ~ NA_real_))

Я бы, однако, сделал,

df %>% 
 mutate(year = readr::parse_number(length_of_service),
        length_of_service_new = replace(year, year == 1, 0.99))

, который должен вернуть тот же вывод, что и вышеприведенный case_when вывод.

...