#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:
Вот альтернативный подход:
- Удалите все буквенные буквы
'[A-Za-z]'
сstr_remove_all
- разделите полученные числа
- примените расчет после перехода на числовой с
type.convert(as.is = TRUE)
- повторная привязка к оригинальным кольцам с
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. Мне очень понравилась заключительная часть вашего подхода!