我有一些看起来像这样的文字:
"Word1 word2 word3 word4 12/31/1980 word word words"
"Word1 word2 word3 11/2/90 word word words 10/2/1991."
"Word1 8/1/2003 word2 word3 word4 11/8/1990 word word words October 4, 1997 words."
我想用文本中的日期和另一个日期之间的天数替换当前日期。
例如在这种情况下:
"Word1 word2 word3 word4 1000 word word words"
"Word1 word2 word3 2000 word word words 2365."
"Word1 4000 word2 word3 word4 4005 word word words 5000 words."
(顺便说一下,我编了替换号码。)
我在使用mdy()获得正确的年份方面遇到了一些麻烦。到目前为止,我的解决方案是提取和格式化日期,然后在文本字段中进行并替换它的两步过程。
# extract and format 2 digit year dates
re <- ".*\\s+(\\d{1,2}/\\d{1,2}/\\d{2})\\D.*"
path$path_date_magic_2year <- mdy(with(path, ifelse(grepl(re, path_notes),sub(re,'\\1',path_notes),'')))
# replace the date in the text with the extracted and formatted date
for (i in 1:length(path$path_date_magic_2year)){
if (!is.na(path$path_date_magic_2year[i])) {
path$path_date_magic_2year_test[i] <- sub('\\d{1,2}/\\d{1,2}/\\d{2}', path$path_date_magic_2year[i] , path$path_notes[i])
}
}
(在我完成2位数的年份日期之后,然后我执行4位数年份日期,然后是月份写出日期.mdy()理论上处理所有这些,但是当我最初这样做时并非所有这些都是正确的分开时几乎完美。)
那就是那个。
如果文本字段中只有一个日期,则当前方法有效。
所以我剩下的问题是当文本中有多个日期时如何处理这种情况。我在自由文本字段中有1到6个日期。
我想做的是一步一步解决所有问题,无论文本字段中的日期数是多少,使用gsub进行贪婪替换。然而,我还没有找到一种方法来完成这项工作。
我是如何做到这一点的?
答案 0 :(得分:2)
假设向量txt
包含您的文字,myDate
是minuend:
myDate <- Sys.Date() # for example
Sys.setlocale("LC_TIME", "english") # if needed
regex <- paste0("\\d{1,2}/\\d{1,2}/\\d{2,4}", "|((", paste(month.name, collapse = "|"), ") \\d{1,2}, \\d{2,4})")
days <- sapply(lapply(matches <- regmatches(txt, gregexpr(regex, txt)), function(x) if (length(x)) as.Date(x, lubridate::guess_formats(x, "mdy"))) , function(date) as.numeric(myDate - date))
for (x in seq_along(txt))
for (y in seq_along(days[[x]]))
txt[x] <- sub(matches[[x]][y], days[[x]][y], txt[x], fixed = TRUE)
# [1] "Word1 word2 word3 word4 12518 word word words"
# [2] "Word1 word2 word3 8925 word word words 8591."
# [3] "Word1 4270 word2 word3 word4 8919 word word words 6397 words."