我有要读入R的pdf文件。我正在使用data.frame
将它们转换为tabluizer::extract_tables
PDF文件有6列/变量,每个文档可以有多个页面...很好,可以正常工作。我想做的是在我的for循环中添加文件名的第7列,但是由于出现以下错误而失败:
Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match
这是我的代码:
for(i in 1:length(pdf.list)){
print(paste("Reading - ", pdf.list[i]))
cur.doc <- extract_tables(pdf.list[i])
for(j in 1:length(cur.doc)){
cur.doc.page <- cur.doc[[j]]
df$FileName = pdf.list[i]
df <- as.data.frame(cur.doc.page)
documents <- rbind(documents, df)
}
}
所以我得到的问题是我的cbind(),但是我不确定a)原因和b)如何解决。 pdf.list[i]
给出当前文件名。
UPDATE
这终于做到了,所有的错误
documents <- data.frame()
error.page.df <- data.frame()
for(i in 1:length(pdf.list)){
print(paste("Reading file -", pdf.list[i]))
cur.doc <- extract_tables(pdf.list[i])
print(paste("There are", length(cur.doc), "pages in the current file."))
for(j in 1:length(cur.doc)){
cur.doc.page <- cur.doc[j]
print(
paste(
"Reading page -"
, j
, "There are"
, ncol(as.data.frame(cur.doc.page))
, "columns."
)
)
df <- as.data.frame(cur.doc.page)
df <- df[-1, ]
df <- df[, colSums(df != "") != 0]
df$FileName <- pdf.list[i]
tmp.col.names <- c(
"V1","V2","V3","V4","V6","FileName"
)
try(colnames(df) <- tmp.col.names, silent = T)
possible.error <- try(rbind(documents, df))
if(isTRUE(class(possible.error)=="try-error")) {
print(
paste(
"Could not insert page"
, j
, "for file -"
, pdf.list[i]
)
)
error.msg <- paste(
"Could not insert page"
, j
, "for file -"
, pdf.list[i]
)
error.page.df <- rbind(error.page.df, error.msg)
next
} else {
documents <-rbind(documents, df)
possible.error <- NA
}
}
}
答案 0 :(得分:2)
很难说...我认为您可能还有更多错误。也许是for (j in 1:length(cur.doc))
,而不是1:length(cur.doc[i])
。而您创建了df
但从不使用它……是说documents <- rbind(documents, df)
而不是rbind(documents, cur.doc.page)
?
无论哪种方式,我认为您都想将新列添加到当前文档中,而不是整个documents
数据框中。现在的编码方式是,每次通过内部循环向documents
添加一个全新的列。但是rbind
要求您具有相同数量的列。
我假设您要使用df
,因此在绑定到文档之前将列添加到df
:
df$filename = pdf.list[i]
(您在代码中使用了pdf.list[j]
,但在文本中似乎应该是[i]
)。
赞:
documents <- data.frame()
for(i in 1:length(pdf.list)){
print(paste("Reading - ", pdf.list[i]))
cur.doc <- extract_tables(pdf.list[i])
for(j in 1:length(cur.doc)){
cur.doc.page <- cur.doc[[j]]
df <- as.data.frame(cur.doc.page)
df$FileName <- pdf.list[i]
documents <- rbind(documents, df)
}
}