我遇到了与这里列出的lubridate adds a century个问题类似的问题,我对所提供的答案并不是很满意.问题是,这将返回一个列表,而当try 将其放入数据框中时,将返回负值并擦除dmy格式.

我想要做的是1)逆转任何不适当的世纪加法,2)将该值作为向量返回到数据帧中,以及3)确切地理解我过go 是怎么做的.

我使用的是LubriDate 1.9.2和R版本4.2.3.我有以下几点:

some_dates = c("1/1/63", "1/1/94", "1/1/65", "1/1/01", "1/1/86", "1/1/61", "1/1/71", "1/1/69", "1/1/86", "1/1/83", "1/1/94", "1/1/57", "1/1/79", "1/1/83", "1/1/01", "1/1/55", "1/1/77", "1/1/77", "1/1/77", "1/1/90")

twenty_later = c("1/1/84", "1/1/04", "1/1/85", "1/1/21", "1/1/06", "1/1/81", "1/1/91", "1/1/89", "1/1/06", "1/1/03", "1/1/14", "1/1/77", "1/1/99", "1/1/03", "1/1/21", "1/1/75", "1/1/97", "1/1/97", "1/1/97", "1/1/10")

df <- data.frame(some_dates, twenty_later)


df <- df |>
     mutate(
       some_dates_clean = dmy(some_dates),
       twenty_later_clean = dmy(twenty_later)
     )

这显示1/1/57是2057年,而不是1957年.在前面的问题中,有一个函数:

adjustCentury <- function(d, threshold=1930){
  y <- year(d) %% 100
  if(y > threshold %% 100) year(d) <- 1900 + y
  d
}

但当我使用它的时候

df$some_dates_clean2 <- lapply(df$some_dates_clean, adjustCentury)

它给出了错误的输出.如果我使用以下内容:

lapply(df$some_dates_clean, adjustCentury)

它创建了一个列表,我可以unlist()个,但它返回了一个不需要的格式.

这里列出的方法 str_replace(some_dates, '[0-9]+$', '19\\0')

获取应为2001的值并将其转换为1901.我不擅长regex,虽然我知道第一个参数是寻找0-9之间的值,但我不确定在第二个参数19\\0中如何解释这一点,即使在regex101.com上观看了现场演示后也是如此.

根据发帖者的说法,这种方法有效,但完全不清楚为什么这种方法在2057年失败.

future_dates <- year(some_dates) > year(Sys.Date())
year(dates[future_dates]) <- year(dates[future_dates]) - 100

先谢谢你.我没有资格对这些帖子发表 comments 并提出后续问题,而且这些说明对我的理解水平来说太不透明了.

推荐答案

try 使用lubridate::parse_date_time2();它允许您设置cutoff_2000参数,以定义哪些两位数的年份被解析为2000年后:

library(dplyr)
library(lubridate)
some_dates = c("1/1/63", "1/1/94", "1/1/65", "1/1/01", "1/1/86", "1/1/61", "1/1/71", "1/1/69", "1/1/86", "1/1/83", "1/1/94", "1/1/57", "1/1/79", "1/1/83", "1/1/01", "1/1/55", "1/1/77", "1/1/77", "1/1/77", "1/1/90")
twenty_later = c("1/1/84", "1/1/04", "1/1/85", "1/1/21", "1/1/06", "1/1/81", "1/1/91", "1/1/89", "1/1/06", "1/1/03", "1/1/14", "1/1/77", "1/1/99", "1/1/03", "1/1/21", "1/1/75", "1/1/97", "1/1/97", "1/1/97", "1/1/10")
df <- data.frame(some_dates, twenty_later)

df |>
  mutate(
    some_dates_clean = parse_date_time2(some_dates, "dmy", cutoff_2000 = 30),
    twenty_later_clean = parse_date_time2(twenty_later,"dmy", cutoff_2000 = 30),
    diff = twenty_later_clean - some_dates_clean
  ) |> 
  arrange(diff) |>
  head()
#>   some_dates twenty_later some_dates_clean twenty_later_clean      diff
#> 1     1/1/94       1/1/04       1994-01-01         2004-01-01 3652 days
#> 2     1/1/65       1/1/85       1965-01-01         1985-01-01 7305 days
#> 3     1/1/01       1/1/21       2001-01-01         2021-01-01 7305 days
#> 4     1/1/86       1/1/06       1986-01-01         2006-01-01 7305 days
#> 5     1/1/61       1/1/81       1961-01-01         1981-01-01 7305 days
#> 6     1/1/71       1/1/91       1971-01-01         1991-01-01 7305 days

# vs original:
df |>
  mutate(
    some_dates_clean = dmy(some_dates),
    twenty_later_clean = dmy(twenty_later),
    diff = twenty_later_clean - some_dates_clean
  ) |>
  arrange(diff) |>
  head()
#>   some_dates twenty_later some_dates_clean twenty_later_clean        diff
#> 1     1/1/65       1/1/85       2065-01-01         1985-01-01 -29220 days
#> 2     1/1/61       1/1/81       2061-01-01         1981-01-01 -29220 days
#> 3     1/1/57       1/1/77       2057-01-01         1977-01-01 -29220 days
#> 4     1/1/55       1/1/75       2055-01-01         1975-01-01 -29220 days
#> 5     1/1/63       1/1/84       2063-01-01         1984-01-01 -28855 days
#> 6     1/1/94       1/1/04       1994-01-01         2004-01-01   3652 days

创建于2023-07-19年第reprex v2.0.2

R相关问答推荐

如何根据包含相同值的某些列获取总额

根据列表中项目的名称多次合并数据框和列表

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

如何在xyplot中 for each 面板打印R^2

隐藏e_mark_line的工具提示

使用ggsankey调整Sankey图中单个 node 上的标签

如何在ggplot中标记qqplot上的点?

线性模型斜率在减少原始数据时提供NA

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

如何在PackageStatus()中列出&q;不可用的包&q;?

QY数据的处理:如何定义QY因素的水平

如何计算R glm probit中的线性预测因子?

远离理论值的伽马密度曲线下面积的近似

如何显示准确的p值而不是<;0.001*?

如何将EC50值绘制在R中的剂量-react 曲线上?

如何使用grepl()在数据帧列表中 Select 特定字符串?

在shiny 表格中输入的文本在第一次后未更新

了解nchar在列表上的意外行为

在R中添加要打印的垂直线

Data.table条件合并