将seer数据加载到R

时间:2018-05-01 15:11:33

标签: r loading read.table fixed-width

我正在尝试从ASCII文件加载SEER数据。只有一个.sas加载文件,我试图转换为R加载命令。

.sas加载文件如下所示:

filename seer9 './yr1973_2015.seer9/*.TXT';                                           

data in;                                                                              
infile seer9 lrecl=362;                                                             
input                                                                               
@ 1   PUBCSNUM             $char8.  /* Patient ID */                              
@ 9   REG                  $char10. /* SEER registry */                           
@ 19  MAR_STAT             $char1.  /* Marital status at diagnosis */             
@ 20  RACE1V               $char2.  /* Race/ethnicity */                          
@ 23  NHIADE               $char1.  /* NHIA Derived Hisp Origin */                
@ 24  SEX                  $char1.  /* Sex */    

我有以下代码尝试复制类似的加载过程:

data <- read.table("OTHER.TXT", 
col.names = c("pubcsnum", "reg", "mar_stat", "race1v", "nhaide", "sex"),
sep = c(1, 9, 19, 20, 23, 24))

如果我使用sep问题,我会收到以下错误:

Error in read.table("OTHER.TXT", col.names = c("pubcsnum", "reg", "mar_stat",
:invalid 'sep' argument

如果我不使用sep参数,我会收到以下错误:

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,
: 
  line 1 did not have 133 elements

有没有人有加载先见数据的经验?有没有人建议为什么这不起作用?

*当我使用fill = TRUE参数时,第二个错误line 1 did not have 133 elements不再发生,但是当我评估前几个观察时数据不正确。我通过评估已知变量sex进一步确认:

> summary(data$sex)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
0.000e+00 2.000e+00 3.020e+03 7.852e+18 9.884e+13 2.055e+20 

其中值为1/2,摘要是无意义的

2 个答案:

答案 0 :(得分:1)

因此,其他注释和答案指出了其中的大部分内容,但这是针对您的确切问题的更完整答案。我听说有很多人在努力处理这些ASCII文件(包括许多相关的但不是很简单的程序包),我想为其他正在搜索的人回答这些问题。

固定宽度的文件

这些SEER“ ASCII”文件实际上是固定宽度的文本文件(ASCII是一种编码标准,不是文件格式)。这意味着没有分隔符(例如.csv或.tsv)的分隔符(例如“,”或“ \ t”)。

相反,每个字段由行中的开始和结束位置(有时是开始位置和字段的宽度/长度)定义。这是我们在您总结的.sas文件中看到的内容:

input                                                                               
@ 1   PUBCSNUM             $char8.  /* Patient ID */                              
@ 9   REG                  $char10. /* SEER registry */  
...

这是什么意思?

  • 第一个患者ID字段开始于位置 1 ,长度为 8 (从$ char8起,类似于SQL模式中的精度等),这意味着它结束了在位置 8
  • 第二个字段,即SEER注册表ID,从位置 9 (前一个字段为1 + 8)开始,长度为 10 (从$ char10开始)这表示它在位置 18 处结束。

@数持续增加的地方,因此字段不会重叠。

读取固定宽度的文件

我发现readr::read_fwf()函数简单易用,主要是因为它有几个辅助函数,即fwf_positions(),它告诉它如何通过{开头和结尾(或宽度)来定义每个字段{1}})。

因此,要从文件中仅读取这两个字段,我们可以做:

fwf_widths()

只有col_names可以重命名列。

助手脚本。

我之前一直在努力解决这些问题,所以我实际上写了some code来读取.sas文件,并提取起始位置,宽度,列名和描述。

这就是全部,只需替换文件名:

read_fwf(<file>, fwf_positions(start=c(1, 9), end=c(8, 18), col_names=c("patient_id", "registry_id")))

希望有帮助!

答案 1 :(得分:0)

使用read.fwf包中的foreign函数读取.sas文件描述的固定宽度文件。我担心普林斯顿主持的格式很好的网页对于如何使用read.table来实现这个目的是错误的。真的没有分隔符,只有职位。在这种情况下你可以使用(假设你的工作目录中有一个名为“yr1973_2015.seer9”的目录):

 library(utils)  #not really needed, just correcting my faulty memory 
 inputdf <- read.fwf( "yr1973_2015.seer9/OTHER.TXT",
                       widths= c(1, 9, 19, 20, 23, 24),
          col.names = c("pubcsnum", "reg", "mar_stat", "race1v", "nhaide", "sex"))

您将失去大部分信息,因为lrecl值告诉我们每行有362个字符,但这将是一个很好的测试用例,然后您可以切换到SAScii函数....并且谢谢致@AnthonyDamico:

packageDescription("SAScii")
#---------------
Package: SAScii
Type: Package
Title: Import ASCII files directly into R using only a SAS
      input script
Version: 1.0
Date: 2012-08-18
Authors@R: person( "Anthony Joseph" , "Damico" , role = c(
      "aut" , "cre" ) , email = "ajdamico@gmail.com" )
Description: Using any importation code designed for SAS
      users to read ASCII files into sas7bdat files, the
      SAScii package parses through the INPUT block of a
      (.sas) syntax file to design the parameters needed
      for a read.fwf function call.  This allows the user
      to specify the location of the ASCII (often a .dat)
      file and the location of the .sas syntax file, and
      then load the data frame directly into R in just one
      step.
License: GPL (>= 2)
URL: https://github.com/ajdamico/SAScii
Depends: R (>= 2.14)
LazyLoad: Yes
Packaged: 2012-08-17 08:35:18 UTC; AnthonyD
Author: Anthony Joseph Damico [aut, cre]
Maintainer: Anthony Joseph Damico <ajdamico@gmail.com>
Repository: CRAN
Date/Publication: 2012-08-17 10:55:15
Built: R 3.4.0; ; 2017-04-20 18:55:31 UTC; unix

-- File: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/SAScii/Meta/package.rds 

我并没有完全确定在这些长行上会有效地忽略尾随信息,但是在?read.fwf页面的第一个例子中检查了这个轻微模式:

> ff <- tempfile()
> cat(file = ff, "12345689", "98765489", sep = "\n")
> read.fwf(ff, widths = c(1,2,3))
  V1 V2  V3
1  1 23 456
2  9 87 654
>unlink(ff)

我检查了我的记忆,使用安东尼的名字作为搜索词可能会有所帮助,并发现他的网站已经更新。退房:

http://asdfree.com/surveillance-epidemiology-and-end-results-seer.html