我遇到了与这里列出的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 并提出后续问题,而且这些说明对我的理解水平来说太不透明了.