R语言 如何从下面的字符串中提取年份?

1tuwyuhd  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(148)

在我的数据集中没有此列的设置公式。月、年、日没有特定的顺序。我唯一能确定的就是年份。我想我可以用RegEx来做,但我想不出来。

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

bxfogqkk

bxfogqkk1#

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

nbnkbykc

nbnkbykc2#

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

    • 1)**匹配任何.*,捕获4个数字(\\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)**另一种方法是用空字符串重复替换边界\\b后跟2个字符../,或者|/后跟2个字符..和边界\\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)**追加/01,然后使用as.Date和一个可能的格式向量,给出一个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)**使用strcapture提取4个连续数字。
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)**使用strapply提取4个连续数字。如果需要字符结果,请将as.numeric替换为c
library(gsubfn)
strapply(V1, "\\d{4}", as.numeric, simplify = TRUE)
## [1] 1999 2003 2023

相关问题