gpt4 book ai didi

r - 有效地使用 pdftools 包中的 pdf_data 函数

转载 作者:行者123 更新时间:2023-12-05 00:57:25 24 4
gpt4 key购买 nike

最终目标是使用 pdftools 包高效地浏览一千页 pdf 文档,以一致且安全地生成可用的数据框/tibble。我曾尝试使用 tabulizer 包和 pdf_text 函数,但结果不一致。因此,开始使用我更喜欢的 pdf_data() 函数。

对于不熟悉pdf_data函数的人,它将pdf页面转换为坐标网格,0,0坐标位于页面的左上角。因此,通过排列 x,y 坐标,然后将文档旋转为宽格式,所有信息都会像在页面上一样显示,只有 NA 用于空格

这是一个使用熟悉的 mtcars 数据集的简单示例。

library(pdftools)
library(tidyverse)
library(janitor)

pdf_file <- "https://github.com/ropensci/tabulizer/raw/master/inst/examples/data.pdf"

mtcars_pdf_df <- pdf_data(pdf_file)[[1]]

mtcars_pdf_df%>%
arrange(x, y)%>%
pivot_wider(id_cols = y, names_from = x, values_from = text)%>%
unite(col = Car_type, `154`:`215`, sep = " ", remove = TRUE, na.rm = TRUE)%>%
arrange(y)%>%
rename("Page Number" = `303`)%>%
unite(col = mpg, `253`:`254`, sep = "", remove = TRUE, na.rm = TRUE)%>%
unite(col = cyl, `283` : `291` , sep = "", remove = TRUE, na.rm = TRUE)%>%
unite(col = disp, `308` : `313`, sep = "", remove = TRUE, na.rm = TRUE)

最好不要使用十几个联合函数来重命名各个列。我曾经使用看门人包 row_to_names() 函数将第 1 行转换为列名,效果很好,但也许有人有更好的想法?

中心问题;通过合并多个列或移动列以使 NA 被相邻列填充,从数据集中删除 NA。

我正在努力提高效率。可以使用 purrr 包吗?非常感谢任何有助于提高此过程效率的帮助。

关于 pdf_data() 函数的唯一信息来自这里... https://ropensci.org/technotes/2018/12/14/pdftools-20/任何其他资源也将不胜感激(除了 pdftools 包帮助文档/文献)。

谢谢大家!我希望这也有助于其他人使用 pdf_data() :)

最佳答案

如果您知道 PDF 是一个相当整洁的表格,那么这可能是一种可以推广的方法...

library(pdftools)
library(tidyverse)

pdf_file <- "https://github.com/ropensci/tabulizer/raw/master/inst/examples/data.pdf"

df <- pdf_data(pdf_file)[[1]]

df <- df %>% mutate(x = round(x/3), #reduce resolution to minimise inconsistent coordinates
y = round(y/3)) %>%
arrange(y, x) %>% #sort in reading order
mutate(group = cumsum(!lag(space, default = 0))) %>% #identify text with spaces and paste
group_by(group) %>%
summarise(x = first(x),
y = first(y),
text = paste(text, collapse = " ")) %>%
group_by(y) %>%
mutate(colno = row_number()) %>% #add column numbers for table data
ungroup() %>%
select(text, colno, y) %>%
pivot_wider(names_from = colno, values_from = text) %>% #pivot into table format
select(-y) %>%
set_names(c("car", .[1,-ncol(.)])) %>% #shift names from first row
slice(-1, -nrow(.)) %>% #remove names row and page number row
mutate_at(-1, as.numeric)

df
# A tibble: 32 x 12
car mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 Mazda RX4 Wag 21 6 160 110 3.9 2.88 17.0 0 1 4 4
3 Datsun 710 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
4 Hornet 4 Drive 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
5 Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
6 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
7 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
8 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
9 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
10 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# ... with 22 more rows

关于r - 有效地使用 pdftools 包中的 pdf_data 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60127375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com