在我的数据集中没有此列的设置公式。月、年、日没有特定的顺序。我唯一能确定的就是年份。我想我可以用RegEx来做,但我想不出来。
V1 <- c("02/04/1999", "2003/02", "01/2023") df <- as.data.frame(V1)
bxfogqkk1#
您可以将格式列表传递给lubridate::parse_date_time():
lubridate::parse_date_time()
library(lubridate) library(dplyr) V1 <- c("02/04/1999", "2003/02", "01/2023") df <- as.data.frame(V1) known_formats <- c("mdY", "Ym", "mY") df %>% mutate(year = parse_date_time(V1, known_formats) %>% year()) #> V1 year #> 1 02/04/1999 1999 #> 2 2003/02 2003 #> 3 01/2023 2023
创建于2023-06-24带有reprex v2.0.2
nbnkbykc2#
除了(6)之外,这些替代方案仅使用碱基R。(2)在击键方面是最短的,但(1)几乎一样短。
.*
(\\d{4})
\\1
as.numeric
V1 <- c("02/04/1999", "2003/02", "01/2023") as.numeric(sub(".*(\\d{4}).*", "\\1", V1)) ## [1] 1999 2003 2023
\\b
..
/
|
as.numeric(gsub("\\b../|/..\\b", "", V1)) ## [1] 1999 2003 2023
sapply(strsplit(V1, "/", fixed = TRUE), \(x) max(as.numeric(x))) ## [1] 1999 2003 2023
/01
as.Date
V1 |> paste0("/01") |> as.Date(c("%m/%d/%Y", "%Y/%m/%d", "%m/%Y/%d")) |> format("%Y") |> as.numeric() ## [1] 1999 2003 2023
strcapture
strcapture("(\\d{4})", V1, data.frame(year = numeric(0)))[[1]] ## [1] 1999 2003 2023
或
strcapture("(\\d{4})", V1, data.frame(year = numeric(0))) ## year ## 1 1999 ## 2 2003 ## 3 2023
strapply
c
library(gsubfn) strapply(V1, "\\d{4}", as.numeric, simplify = TRUE) ## [1] 1999 2003 2023
2条答案
按热度按时间bxfogqkk1#
您可以将格式列表传递给
lubridate::parse_date_time()
:创建于2023-06-24带有reprex v2.0.2
nbnkbykc2#
除了(6)之外,这些替代方案仅使用碱基R。(2)在击键方面是最短的,但(1)几乎一样短。
.*
,捕获4个数字(\\d{4})
,匹配任何剩余的.*
,并将其全部替换为第一个(也是唯一的)捕获部分\\1
。如果您希望结果是字符,请省略as.numeric
。未使用任何包。\\b
后跟2个字符..
和/
,或者|
,/
后跟2个字符..
和边界\\b
。/01
,然后使用as.Date
和一个可能的格式向量,给出一个Date类对象。然后从中提取年份。strcapture
提取4个连续数字。或
strapply
提取4个连续数字。如果需要字符结果,请将as.numeric
替换为c
。