regex 如何提取字符串列的第二个日期?

jpfvwuh4  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个包含日期字符串的数据框:

df <- tribble(
  ~text,
  "...text...1/5/17 ...text... 12/26/18",
  "...text...3/1/19 ...text... 4/5/19",
  "...text...10/5/14 ...text...",
  "...text...5/5/16 ...text... 9/16/17",
  "...text...",
  "...text...2/22/20 ...text..."
)

我想捕获每个字符串的第二个日期,如果它存在的话。最终我想将捕获的日期存储在 Dataframe 的一列中。我尝试使用stringr::str_extract,它似乎没有捕获第二个日期,即使使用group=2参数。(我很确定有一种更好的方法来编写正则表达式,但我真的想不出一种...)

str_extract(df$text, ".*(\\d+\\/\\d+\\/\\d+)|.*(\\d+\\/\\d+\\/\\d+)", group = 2)

输出

[1] NA NA NA NA NA NA

我的下一个尝试是使用stringr::str_extract_all,结果输出在list中,它捕获了第一个和第二个日期,我编写了一个for循环,只提取每个字符串中的第二个日期。

str_extract_all(df$text, "(\\d+\\/\\d+\\/\\d+)") -> result

result2 <- rep(NA, length(result))

for (i in 1:length(result)){
  if(length(result[[i]] > 1)){
    result2[[i]] <- result[[i]][2]
  }
}

df$second_date <- result2
df

输出

> df
# A tibble: 6 × 2
  text                                 second_date
  <chr>                                <chr>      
1 ...text...1/5/17 ...text... 12/26/18 12/26/18   
2 ...text...3/1/19 ...text... 4/5/19   4/5/19     
3 ...text...10/5/14 ...text...         NA         
4 ...text...5/5/16 ...text... 9/16/17  9/16/17    
5 ...text...                           NA         
6 ...text...2/22/20 ...text...         NA

我发现我做的代码效率很低,想知道是否有其他方法来完成同样的任务。如果可能的话,我想避免使用for循环。谢谢。

aoyhnmkz

aoyhnmkz1#

如果只有两个看起来像日期的东西,那么你可以使用str_extract_all()来获取这两个日期,然后第二列将是第二个日期,如果存在的话。

library(stringr)
library(dplyr)
library(tidyr)
df <- tibble::tribble(
  ~text,
  "...text...1/5/17 ...text... 12/26/18",
  "...text...3/1/19 ...text... 4/5/19",
  "...text...10/5/14 ...text...",
  "...text...5/5/16 ...text... 9/16/17",
  "...text...",
  "...text...2/22/20 ...text..."
)
df %>% 
  mutate(date = as.data.frame(str_extract_all(text, "\\d+\\/\\d+\\/\\d+", simplify=TRUE))) %>% 
  unnest_wider(date) %>% 
  mutate(across(c(V1, V2), lubridate::mdy))
#> # A tibble: 6 × 3
#>   text                                 V1         V2        
#>   <chr>                                <date>     <date>    
#> 1 ...text...1/5/17 ...text... 12/26/18 2017-01-05 2018-12-26
#> 2 ...text...3/1/19 ...text... 4/5/19   2019-03-01 2019-04-05
#> 3 ...text...10/5/14 ...text...         2014-10-05 NA        
#> 4 ...text...5/5/16 ...text... 9/16/17  2016-05-05 2017-09-16
#> 5 ...text...                           NA         NA        
#> 6 ...text...2/22/20 ...text...         2020-02-22 NA

创建于2023-03-23带有reprex v2.0.2

bvpmtnay

bvpmtnay2#

您可以使用正则表达式来提取第二个日期。

second_date <- str_extract(df$text, '...text... ([0-9/]+$)',group = 1)
second_date
[1] "12/26/18" "4/5/19"   NA         "9/16/17"  NA         NA        

df$second_date <- second_date
df
# A tibble: 6 × 2
  text                                 second_date
  <chr>                                <chr>      
1 ...text...1/5/17 ...text... 12/26/18 12/26/18   
2 ...text...3/1/19 ...text... 4/5/19   4/5/19     
3 ...text...10/5/14 ...text...         NA         
4 ...text...5/5/16 ...text... 9/16/17  9/16/17    
5 ...text...                           NA         
6 ...text...2/22/20 ...text...         NA

相关问题