提问人:angeliquelinde 提问时间:6/24/2023 最后编辑:benson23angeliquelinde 更新时间:6/25/2023 访问量:85
如何从以下字符串中提取年份?
How do I extract the year from the following string?
问:
在我的数据集中,此列没有固定的公式。月、年、日没有特别的顺序。我唯一可以确定的是年份。我想我可以用正则表达式来做,但想不通。
V1 <- c("02/04/1999", "2003/02", "01/2023")
df <- as.data.frame(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})
.*
\\1
as.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 类对象。然后从中提取年份。/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
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 个连续数字。如果需要字符结果,请替换为。strapply
as.numeric
c
library(gsubfn)
strapply(V1, "\\d{4}", as.numeric, simplify = TRUE)
## [1] 1999 2003 2023
评论
sub(".*(\\d{4}).*", "\\1", V1)
.* ... .*