我试图使用pdftools包从pdf中提取数据表。我的源文件在这里:https://hypo.org/app/uploads/sites/2/2021/11/HYPOSTAT-2021_vdef.pdf。比方说,我想从第170页的表20 (名义房价的变化)中提取数据。
我使用以下代码:
install.packages("pdftools")
library(pdftools)
report <- pdftools::pdf_data("https://hypo.org/app/uploads/sites/2/2021/11/HYPOSTAT-2021_vdef.pdf")
tab20 <- as.data.frame(report[170])要获得正确的表,我必须手动指示要提取列表的第170元素(因为该表位于第170页)。如果明年在报告中添加一个带有表的新页面,我将不得不修改代码以提取第171元素。有没有一种更自动化的方法?
基本上,我需要做的是找到列表中包含字符串“名义房价变化”的元素。有什么建议吗?
发布于 2021-11-26 14:23:14
另一种基于purrr::map_lgl的解决方案
library(tidyverse)
library(pdftools)
report <- pdftools::pdf_data("https://hypo.org/app/uploads/sites/2/2021/11/HYPOSTAT-2021_vdef.pdf")
map_lgl(
report,
~ str_detect(
str_c(.x$text, collapse = " "),
"Change in Nominal house price")) %>% report[.]
#> [[1]]
#> # A tibble: 606 × 6
#> width height x y space text
#> <int> <int> <int> <int> <lgl> <chr>
#> 1 59 14 39 38 TRUE STATISTICAL
#> 2 35 14 102 38 FALSE TABLES
#> 3 25 26 33 81 TRUE 20.
#> 4 60 26 65 81 TRUE Change
#> 5 15 26 129 81 TRUE in
#> 6 67 26 149 81 TRUE Nominal
#> 7 47 26 221 81 TRUE house
#> 8 41 26 272 81 FALSE price
#> 9 30 14 65 103 TRUE Annual
#> 10 7 14 98 103 TRUE %
#> # … with 596 more rows发布于 2021-11-26 13:52:02
您可以找到一个具有相应模式的字符串。通过使用多个过滤器,您可以收集这个奇异表。
table <- report[grepl('Change', report) & grepl('Nominal', report) &
grepl('house', report)]我想一个更精巧的regex可能会起作用。这也只是因为没有其他表具有相同的标题,但是最好检查它是否只返回如下所示的值:
place <- grepl('Change', report) &
grepl('Nominal', report) &
grepl('house', report)
if(sum(place) != 1){
stop("There is not only one pattern that match. Adjust pattern.")
} else {
table <- report[place]
}编辑:要加快速度,最好使用@Paul解决方案。我用grepl和改编了它,它更快了!但是,您需要确保标题不发生任何更改。
system.time(
place <- unlist(lapply(report, function(x) grepl("Change in Nominal house price",
paste(x$text, collapse = " "))))
)
# user system spent
# 0.07 0.00 0.08
system.time(
place <- grepl('Change', report) & grepl('Nominal', report) &
grepl('house', report)
)
# user system spent
# 1.99 0.01 2.03 https://stackoverflow.com/questions/70125169
复制相似问题