str_extract_all中的“下标超出范围”错误

时间:2019-07-09 03:44:25

标签: r stringr tm quanteda

我正在尝试使用str_extract_all从多个文本文件中提取日期信息。如果我做一个文件,它可以正常工作。但是,当我将它放入for循环中时,它给了我这个错误。

我已经尝试过“随时”操作,但它不起作用,其他基本时间提取工具均不起作用。

这是给我麻烦的代码部分:

file.names <- list.files(path = "C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360",  pattern = "txt$")

for(i in 1:length(file.names)){

named <- read.table(file.names[i], header=FALSE, sep="", fill = TRUE)

renamed <- corpus(file.names[i])

date <- str_extract_all(texts(renamed)
                        , "(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
                        , simplify = TRUE)[,1]
}

我希望这段代码能够从一系列类似

的文本文件中提取日期

“日期 于2018年12月12日在 文本 笔录中的一堆文字”

我得到的是错误消息“下标超出范围”。我不知道这是什么意思。就像我说的那样,它只能在单个文件上工作,但不能在循环中工作。感谢您提供的所有帮助。

1 个答案:

答案 0 :(得分:0)

这与您没有通过[, 1]索引操作获得期望的结果有关。如果其中一个文件不包含匹配项,则在循环中它将返回一个空标量,该标量无法以此方式进行索引。

这是一种更简单的方法:使用 readtext 输入文件。

library("quanteda")
library("stringr")

corp <- readtext::readtext("C:/Users/jwils/Documents/R/win-library/3.6/CNN_files/AC360/*.txt") %>%
    corpus()

docvars(corp, "date") <- 
    str_extract_all(texts(corp),
                    "(\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Oct(?:ober)?|Dec(?:ember)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|(\\b(?:JAN(?:UARY)?|FEB(?:RUARY)?|MAR(?:CH)?|APR(?:IL)?|MAY|JUN(?:E)?|JUL(?:Y)?|AUG(?:UST)?|SEP(?:TEMBER)?|NOV(?:EMBER)?|OCT(?:OBER)?|DEC(?:EMBER)?) (?:19[7-9]\\d|2\\d{3})(?=\\D|$))|((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\s+\\d{1,2},\\s+\\d{4})|(\\b(JAN(UARY)?|FEB(RUARY)?|MAR(CH)?|APR(IL)?|MAY|JUN(E)?|JUL(Y)?|AUG(UST)?|SEP(TEMBER)?|OCT(OBER)?|NOV(EMBER)?|DEC(EMBER)?)\\s+\\d{1,2},\\s+\\d{4})"
                    simplify = TRUE)[, 1]

# to verify
summary(corp)

这会将日期分配给您的语料库作为新的文档变量。如果愿意,还可以将它们仅分配给一个向量(例如date)。

我没有您的任何原始文件,因此不能保证这会起作用。但是,只要您在文本文件中有日期并且readtext()调用会找到它们,它就可以工作。