繁体   English   中英

如何在 r 中将日期值转换为年份

[英]How do i convert my date values into year in r

又是面对新情结的一天

以下是我作为输入的列和行:

ID  Age
123 23 Years 1 Month 2 Days
125 28 Years 9 Month 14 Days
126 28 years
127 34 YEAR
128 35 Years 8 Month 21 Days
129 38 Years 5 Month 25 Days
130 32.8

我需要它们在新列中按年度计算,例如:

ID  Age                      Age_new
123 23 Years 1 Month 2 Days     23.1
125 28 Years 9 Month 14 Days    28.9
126 28 years                    28
127 34 YEAR                     34
128 35 Years 8 Month 21 Days    35.8
129 38 Years 5 Month 25 Days    38.5
130 32.8                        32.8

我已经尝试了 by stringr package 但我只得到了第一个字符串,它不像上面那样提供。

这是一个粗略的近似值:

func <- function(x, ptn) {
  out <- gsub(paste0(".*?\\b([0-9.]+)\\s*", ptn, ".*"), "\\1", x, ignore.case = TRUE)
  ifelse(out == x, NA, out)
}

library(dplyr)
dat %>%
  mutate(data.frame(
    lapply(c(yr = "year", mon = "month", day = "day"),
           function(ptn) as.numeric(func(Age, ptn)))
  )) %>%
  mutate(
    yr = if_else(is.na(yr), suppressWarnings(as.numeric(Age)), yr),
    across(c(yr, mon, day), ~ coalesce(., 0)), New_Age = yr + mon/12 + day/365
  )
#    ID                      Age   yr mon day  New_Age
# 1 123  23 Years 1 Month 2 Days 23.0   1   2 23.08881
# 2 125 28 Years 9 Month 14 Days 28.0   9  14 28.78836
# 3 126                 28 years 28.0   0   0 28.00000
# 4 127                  34 YEAR 34.0   0   0 34.00000
# 5 128 35 Years 8 Month 21 Days 35.0   8  21 35.72420
# 6 129 38 Years 5 Month 25 Days 38.0   5  25 38.48516
# 7 130                     32.8 32.8   0   0 32.80000

(我不保证真实的准确性。)

这是我的方法。 我总是尽量避免使用正则表达式,因为它对我来说太可怕了。 如果您的数据像您的示例一样完全分开,我认为我的代码将起作用。 我完全理解这不是最有效的方法。 但嘿,它有效

dat %>% 
  mutate(space_counter = stringr::str_count(Age," ")) %>% 
  tidyr::separate(Age,into = paste0("tmp_col_",1:(max(.$space_counter)+1)),sep = " ") %>% 
  select(ID, tmp_col_1,tmp_col_3,tmp_col_5) %>% 
  setNames(c("ID","year","month","day")) %>% 
  mutate(across(everything(), ~replace_na(.x, 0))) %>% 
  mutate_if(is.character,as.integer) %>% 
  mutate(asdur = as.duration(years(year) + months(month) + days(day))) %>% 
  mutate(age_new = as.numeric(asdur)/3.154e+7)

output: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM