r - 将pdf文件中的数据导入R
问题描述
鉴于此 PDF 文件的第 4 页,我想知道是否有办法(使用任何 R 库)将名为SCALE SCORE
和的 2 列FREQ.
导入 R 作为.csv
或其他 R 友好格式?
解决方案
我写了一个包,可以帮助从 pdf 中提取文本。它是用 C++ 从头开始编写的,速度相当快(通常比 pdftools 快一点)。目前,您仍然需要将文本整理到表格中 - 就像在 pdftools 中一样。在你的情况下,它会像这样工作:
library(dplyr)
library(PDFR)
df <- pdfpage("C:/users/Administrator/Documents/sales.pdf", 4)
df <- df[df$left > 440,] %>%
group_by(top) %>%
arrange(left, by_group = TRUE) %>%
summarize(text = paste(text, collapse = ",")) %>%
arrange(-top) %>%
filter(seq(nrow(.)) > 4) %>%
`[[`(2) %>%
read.csv(text = ., header = FALSE,
col.names = c("freq", "cum_freq", "perc", "cum_perc"))
这给了你:
#> freq cum_freq perc cum_perc
#> 1 142 142 0.04 0.04
#> 2 15 157 0.00 0.04
#> 3 78 235 0.02 0.06
#> 4 269 504 0.07 0.13
#> 5 840 1344 0.21 0.34
#> 6 1690 3034 0.42 0.76
#> 7 3254 6288 0.81 1.57
#> 8 5413 11701 1.35 2.92
#> 9 7659 19360 1.91 4.83
#> 10 9696 29056 2.42 7.24
#> 11 11529 40585 2.87 10.12
#> 12 13145 53730 3.28 13.39
#> 13 13830 67560 3.45 16.84
#> 14 14844 82404 3.70 20.54
#> 15 15153 97557 3.78 24.32
#> 16 15120 112677 3.77 28.09
#> 17 15347 128024 3.83 31.92
#> 18 15525 143549 3.87 35.79
#> 19 15710 159259 3.92 39.70
#> 20 15596 174855 3.89 43.59
#> 21 15529 190384 3.87 47.46
#> 22 15451 205835 3.85 51.31
#> 23 15259 221094 3.80 55.12
#> 24 15028 236122 3.75 58.86
#> 25 15147 251269 3.78 62.64
#> 26 14683 265952 3.66 66.30
#> 27 14469 280421 3.61 69.91
#> 28 14229 294650 3.55 73.45
#> 29 13523 308173 3.37 76.82
#> 30 13246 321419 3.30 80.13
#> 31 12987 334406 3.24 83.36
#> 32 12264 346670 3.06 86.42
#> 33 11964 358634 2.98 89.40
#> 34 10841 369475 2.70 92.11
#> 35 9958 379433 2.48 94.59
#> 36 8529 387962 2.13 96.72
#> 37 6729 394691 1.68 98.39
#> 38 4437 399128 1.11 99.50
#> 39 2010 401138 0.50 100.00
虽然这可能看起来有点复杂,但对于像你这样的 pdf 文件来说,每页上的表格都是相同的。如果您在循环中运行上述代码,lapply
则一次获取多个页面的速度可能比剪切和粘贴快得多。
要安装,您需要开发工具:
install.packages("devtools")
devtools::install_github("AllanCameron/PDFR")
编辑
如果有安装问题,这里是 pdftools 中的等价物:
install.packages(pdftools)
df <- pdftools::pdf_data("https://tea.texas.gov/sites/default/files/Scale%20Score%20Distribution%20Graph%201_Grade%203%20to%208%20English-r2_tagged.pdf")[[4]]
df <- df[df$x > 440,] %>%
group_by(y) %>%
arrange(x, by_group = TRUE) %>%
summarize(text = paste(text, collapse = ",")) %>%
arrange(y) %>%
`[[`(2) %>%
`[`(3:41) %>%
read.csv(text = ., header = FALSE,
col.names = c("freq", "cum_freq", "perc", "cum_perc"))
推荐阅读
- javascript - 用另一个类属性/方法扩充所有对象
- python - 具有基于装饰器的方法注册表的类
- c# - 使用受约束的泛型将子类型的集合作为基类型的集合返回。编译器无法推断,为什么?
- c++ - 使用标准 C++ 同时迭代 std::vectors
- database - Laravel:: 多台服务器的数据库事务
- java - 使用 JAXB 和 xjc maven 插件生成 Java 类
- javascript - 当找到图像的相对 URL 存储在 cookie 中时,如何从另一个页面检索图像 URL
- loops - 使用 Kotlin 遍历 firebase 数据库
- android - 在泛型类中注入字段
- matlab - smooth filtering shifts my original signal?