首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R查找列表中的元素从pdf中提取表

R查找列表中的元素从pdf中提取表
EN

Stack Overflow用户
提问于 2021-11-26 13:28:04
回答 2查看 407关注 0票数 2

我试图使用pdftools包从pdf中提取数据表。我的源文件在这里:https://hypo.org/app/uploads/sites/2/2021/11/HYPOSTAT-2021_vdef.pdf。比方说,我想从第170页的表20 (名义房价的变化)中提取数据。

我使用以下代码:

代码语言:javascript
复制
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元素。有没有一种更自动化的方法?

基本上,我需要做的是找到列表中包含字符串“名义房价变化”的元素。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-26 14:23:14

另一种基于purrr::map_lgl的解决方案

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-11-26 13:52:02

您可以找到一个具有相应模式的字符串。通过使用多个过滤器,您可以收集这个奇异表。

代码语言:javascript
复制
table <- report[grepl('Change', report) & grepl('Nominal', report) &
                grepl('house', report)]

我想一个更精巧的regex可能会起作用。这也只是因为没有其他表具有相同的标题,但是最好检查它是否只返回如下所示的值:

代码语言:javascript
复制
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和改编了它,它更快了!但是,您需要确保标题不发生任何更改。

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70125169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档