我的数据框中有 71 列,其中 10 列包含的数据可能包含 1990 年至 2019 年之间的年份,格式为 YYYY(例如 2019)。例如:
id_1 <- c("regkfg_2013", "fsgdf-2014", "f2016sghsg", "gjdg1990_3759")
id_2 <- c("dghdgl2013jg", "2fgdg_2014_hf", "ghdg_2016*89", "gc-hs1990")
Run Code Online (Sandbox Code Playgroud)
我正在尝试找到一种方法从相关单元格中提取年份并将其插入新列中。
到目前为止,我只知道如何以非常耗时的方式过滤数据。我生成了以下代码,其开头如下:
dated_data <- select(undated_data, 1:71) %>%
filter(grepl("1990", id_1) | filter(grepl("1990", id_2) | filter(grepl("1991", id_1) | filter(grepl("1991", id_2)
Run Code Online (Sandbox Code Playgroud)
然而,写完这十个专栏、整整三十年,真的需要很长的时间。我确信有更快的方法。我也不知道如何将每个匹配单元格中的日期提取到新单元格中。
我想要的输出如下所示:
dated_data$year <- c("2013", "2014", "2016", "1990")
有谁知道我该怎么做?预先感谢您的帮助!
有很多方法。这是其中之一:
第 1 步:定义要与正则表达式匹配的模式:
pattern <- "(1|2)\\d{3}"
Run Code Online (Sandbox Code Playgroud)
第 2 步:定义一个函数来提取原始匹配项:
extract <- function(x) unlist(regmatches(x, gregexpr(pattern, x, perl = T)))
Run Code Online (Sandbox Code Playgroud)
步骤 3:将函数应用于您的数据,例如id_1:
extract(id_1)
[1] "2013" "2014" "2016" "1990"
Run Code Online (Sandbox Code Playgroud)
这是另一种方法,实际上更简单;)
它使用包str_extract中的函数 stringr。因此,您安装该软件包并激活它:
install.packages("stringr")
library(stringr)
Run Code Online (Sandbox Code Playgroud)
并用来str_extract拉你的比赛:
years <- str_extract(id_1,"(1|2)\\d{3}")
years
[1] "2013" "2014" "2016" "1990"
Run Code Online (Sandbox Code Playgroud)
编辑:
如果并非每个字符串都包含匹配项,并且您想要保留向量/列的长度,则可以使用ifelse来测试正则表达式是否找到匹配项,如果没有找到匹配项,则将NA.
例如,如果您的数据是这样的(请注意添加的两个不包含年份的字符串):
id_3 <- c("regkfg_2013", "fsgdf-2014", "f2016sghsg", "gjdg1990_3759", "gbgbgbgb", "hnhna25")
Run Code Online (Sandbox Code Playgroud)
ifelse你可以这样设置测试:
years <- ifelse(grepl("(1|2)\\d{3}", id_3), str_extract(id_3,"(1|2)\\d{3}"), NA)
years
[1] "2013" "2014" "2016" "1990" NA NA
Run Code Online (Sandbox Code Playgroud)