R优质资源

好好的表格被放进了pdf,肿么办

2021-06-10  本文已影响0人  小洁忘了怎么分身

0.解决的问题

0.1 有些数据的有用信息表格,存放在正文和附件里,以pdf格式提供。就不方便提取,在此记录从pdf里提取表格的办法。

0.2 很多欧洲国家的小数点是逗号,比如"3.52"会写成"3,52",除了自己写代码处理字符串,也可以使用哈德雷大神的现成函数parse_double

1.提取表格

GSE16011的参考文献附件,下面直接是pdf的网址,也省得下载再读取咯。

附表1是接近300个病人的各种信息,占了前10页。全部提取出来是组织成了一个列表的形式,把列表里的每个数据组合起来即可。

library(tabulizer)
f <- "https://cancerres.aacrjournals.org/content/canres/suppl/2009/11/16/0008-5472.CAN-09-2307.DC1/stabs_1-6.pdf"
re <- extract_tables(f,pages = 1:10) #提取前10页的表格。
str(re)
## List of 10
##  $ : chr [1:32, 1:10] "Database\rnumber" "7" "8" "9" ...
##  $ : chr [1:32, 1:10] "92" "98" "99" "101" ...
##  $ : chr [1:31, 1:10] "155" "157" "158" "161" ...
##  $ : chr [1:32, 1:10] "203" "204" "206" "207" ...
##  $ : chr [1:29, 1:10] "256" "257" "258" "259" ...
##  $ : chr [1:30, 1:10] "336" "337" "343" "344" ...
##  $ : chr [1:29, 1:10] "425" "427" "428" "431" ...
##  $ : chr [1:33, 1:10] "483" "485" "487" "488" ...
##  $ : chr [1:32, 1:10] "565" "566" "567" "568" ...
##  $ : chr [1:5, 1:10] "704" "709" "710" "711" ...
re = do.call(rbind,re)
re[1:4,1:4]
##      [,1]               [,2]    
## [1,] "Database\rnumber" "Gender"
## [2,] "7"                ""      
## [3,] "8"                "Female"
## [4,] "9"                "Male"  
##      [,3]                              
## [1,] "Reviewed histological\rdiagnosis"
## [2,] "control"                         
## [3,] "OD (grade III)"                  
## [4,] "OD (grade III)"                  
##      [,4]               
## [1,] "Age at\rdiagnosis"
## [2,] ""                 
## [3,] "44,57"            
## [4,] "28,69"

2.提取后的调整

上面的提取结果有3个问题

  1. 第一行的内容本该是列名,而没有被正确设为列名

  2. 存在空的格子

  3. 有一些列本该是数值型数据,现在都是字符串型,且有逗号作为小数点的数据

改造问题数据行动

colnames(re) = re[1,]
re = re[-1,]
re = data.frame(re)
re[re==""]=NA

library(readr)
re$Survival..years. = parse_double(re$Survival..years.,locale = locale(decimal_mark = ","))

re$Age.at.diagnosis = parse_double(re$Age.at.diagnosis,locale = locale(decimal_mark = ","))

多说一句,空格子对应的内容就是空字符串"",他没有内容,但他有字符串属性,转换为别的类型时会变成NA。我习惯主动把他全变成NA,不然后续的分析,空字符串也算一种取值。举个栗子:

table(c("","","Alive","Alive","Dead","Dead","Dead"))
## 
##       Alive  Dead 
##     2     2     3
上一篇 下一篇

猜你喜欢

热点阅读