Преобразование полного возраста из символьного в числовое в R

#r #data-cleaning #lubridate #stringr #data-wrangling

#r #очистка данных #лубридат #stringr #споры о данных

Вопрос:

У меня есть набор данных с полным возрастом людей в виде строк (например, «10 лет 8 месяцев 23 дня») в R, и мне нужно преобразовать его в числовую переменную, которая имеет смысл. Я подумываю о том, чтобы преобразовать его в количество дней, которое имеет человек (что сложно, потому что в месяцах разное количество дней). Таким образом, лучшим решением может быть создание двойной переменной, которая показывала бы возраст как 10,6 или 10,8, некоторую числовую переменную, которая содержит информацию о том, что 10 лет 8 месяцев 5 дней больше, чем 10 лет 7 месяцев 12 дней.

Вот пример текущей переменной, которая у меня есть

 library(tibble)  age lt;- tibble(complete_age =   c("10 years 8 months 23 days",  "9 years 11 months 7 days",  "11 years 3 months 1 day",  "8 years 6 months 12 days"))   age  # A tibble: 4 x 1  complete_age   lt;chrgt;  1 10 years 8 months 23 days 2 9 years 11 months 7 days  3 11 years 3 months 1 day  4 8 years 6 months 12 days   

Вот пример возможного результата, который я хотел бы увидеть (с приблизительными значениями для age_num)

 gt; age # A tibble: 4 x 2  complete_age age_num  lt;chrgt; lt;dblgt; 1 10 years 8 months 23 days 10.66 2 9 years 11 months 7 days 9.92 3 11 years 3 months 1 day 11.27 4 8 years 6 months 12 days 8.52  

Таким образом, у меня есть набор данных со столбцом «complete_age», и я хочу создать столбец «возрастное число».

Как это сделать в R? Мне трудно пытаться использовать stringr и lubridate , но, может быть, это правильный путь?

Ответ №1:

Разделитесь на пространстве, а затем вычислите. Обратите внимание, что при необходимости вы можете изменить среднее количество дней в году или в месяце:

 age %gt;%   separate(complete_age, into = c("Y", NA, "M", NA, "D", NA),   convert = TRUE, remove = FALSE) %gt;%   transmute(complete_age, age_num = Y   (M * 30.45   D) / 365.25)  # # A tibble: 4 x 2 # complete_age age_num # lt;chrgt; lt;dblgt; # 1 10 years 8 months 23 days 10.7  # 2 9 years 11 months 7 days 9.94 # 3 11 years 3 months 1 day 11.3  # 4 8 years 6 months 12 days 8.53  

Ответ №2:

Используя lubridate удобные функции, period и time_length :

 library(lubridate) age %gt;%   mutate(age_years = time_length(period(complete_age), unit = "years"))   # A tibble: 4 x 2  # complete_age age_years  # lt;chrgt; lt;dblgt;  # 1 10 years 8 months 23 days 10.729637  # 2 9 years 11 months 7 days 9.935832  # 3 11 years 3 months 1 day 11.252738  # 4 8 years 6 months 12 days 8.532854  

Комментарии:

1. Я знал, что мне это пригодится lubridate … Это именно то, что я искал. Спасибо

Ответ №3:

Вот альтернативный подход:

  1. Удалите все буквенные буквы '[A-Za-z]' с str_remove_all
  2. разделите полученные числа
  3. примените расчет после перехода на числовой с type.convert(as.is = TRUE)
  4. повторная привязка к оригинальным кольцам с bind_cols
 library(dplyr) library(stringr) age %gt;%   mutate(complete_age = str_remove_all(complete_age, "[A-Za-z]")) %gt;%   separate(complete_age, c("year", "month", "day")) %gt;%   type.convert(as.is = TRUE) %gt;%   mutate(ageYear = (year   month/12   day/365), .keep="unused") %gt;%   bind_cols(age)  
 ageYear complete_age   lt;dblgt; lt;chrgt;  1 10.7 10 years 8 months 23 days 2 9.94 9 years 11 months 7 days  3 11.3 11 years 3 months 1 day  4 8.53 8 years 6 months 12 days   

Комментарии:

1. Мне очень понравилась заключительная часть вашего подхода!