我有一个包含日期字符串的数据框:
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循环。谢谢。
2条答案
按热度按时间aoyhnmkz1#
如果只有两个看起来像日期的东西,那么你可以使用
str_extract_all()
来获取这两个日期,然后第二列将是第二个日期,如果存在的话。创建于2023-03-23带有reprex v2.0.2
bvpmtnay2#
您可以使用正则表达式来提取第二个日期。