如何从以下字符串中提取年份?

How do I extract the year from the following string?

提问人:angeliquelinde 提问时间:6/24/2023 最后编辑:benson23angeliquelinde 更新时间:6/25/2023 访问量:85

问:

在我的数据集中,此列没有固定的公式。月、年、日没有特别的顺序。我唯一可以确定的是年份。我想我可以用正则表达式来做,但想不通。

V1 <- c("02/04/1999", "2003/02", "01/2023")
df <- as.data.frame(V1)

enter image description here

r 字符串 提取

评论

1赞 Andre Wildberg 6/24/2023
基础 R 中尝试。这将查找 4 位数字,对其进行分组并用它替换所有内容。sub(".*(\\d{4}).*", "\\1", V1).* ... .*

答:

1赞 margusl 6/24/2023 #1

您可以将格式列表传递给: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

0赞 G. Grothendieck 6/25/2023 #2

除了(6)之外,这些备选方案仅使用基数R.(2)在击键方面是最短的,但(1)几乎一样短。

1) 匹配任何内容,捕获 4 位数字,并匹配剩余的任何内容,并将其全部替换为第一个(也是唯一)捕获的部分,.如果希望结果为 character,请省略 。不使用任何包。.*(\\d{4}).*\\1as.numeric

V1 <- c("02/04/1999", "2003/02", "01/2023")
as.numeric(sub(".*(\\d{4}).*", "\\1", V1))
## [1] 1999 2003 2023

2)另一种方法是用空字符串重复替换后跟2个字符的边界,以及后跟两个字符的或,,a和边界。\\b../|/..\\b

as.numeric(gsub("\\b../|/..\\b", "", V1))
## [1] 1999 2003 2023

3)此基本方法不使用正则表达式。它将每个字符串拆分为多个组件,将这些组件转换为数字,然后取最大的组件。

sapply(strsplit(V1, "/", fixed = TRUE), \(x) max(as.numeric(x)))
## [1] 1999 2003 2023

4) 附加然后与可能格式的向量一起使用,给出一个 Date 类对象。然后从中提取年份。/01as.Date

V1 |>
  paste0("/01") |>
  as.Date(c("%m/%d/%Y", "%Y/%m/%d", "%m/%Y/%d")) |>
  format("%Y") |>
  as.numeric()
## [1] 1999 2003 2023

5) 使用提取 4 个连续数字。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

6) 提取 4 个连续数字。如果需要字符结果,请替换为。strapplyas.numericc

library(gsubfn)
strapply(V1, "\\d{4}", as.numeric, simplify = TRUE)
## [1] 1999 2003 2023