将文件名作为列添加到循环内的data.frame中

时间:2019-03-21 18:50:17

标签: r for-loop

我有要读入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
    }
  }
}

1 个答案:

答案 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)
  }
}