Добавить имя файла в виде столбца в data.frame внутри цикла - PullRequest
0 голосов
/ 21 марта 2019

У меня есть PDF, которые я читаю в R. Я конвертирую их в data.frame, используя tabluizer::extract_tables

PDF-файлы имеют 6 столбцов / переменных и могут иметь несколько страниц на документ ... хорошо, все заработало. То, что я хочу сделать, это добавить 7-й столбец для имени файла внутри моего цикла for, но не удается, когда я получаю ошибку:

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 (), но я не уверен, а) почему и б) как исправить. 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 Ответ

2 голосов
/ 21 марта 2019

Трудно сказать ... Я думаю, у вас может быть больше ошибок. Может быть 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)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...