我正在尝试从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,摘要是无意义的
答案 0 :(得分:1)
因此,其他注释和答案指出了其中的大部分内容,但这是针对您的确切问题的更完整答案。我听说有很多人在努力处理这些ASCII文件(包括许多相关的但不是很简单的程序包),我想为其他正在搜索的人回答这些问题。
这些SEER“ ASCII”文件实际上是固定宽度的文本文件(ASCII是一种编码标准,不是文件格式)。这意味着没有分隔符(例如.csv或.tsv)的分隔符(例如“,”或“ \ t”)。
相反,每个字段由行中的开始和结束位置(有时是开始位置和字段的宽度/长度)定义。这是我们在您总结的.sas文件中看到的内容:
input
@ 1 PUBCSNUM $char8. /* Patient ID */
@ 9 REG $char10. /* SEER registry */
...
@
数持续增加的地方,因此字段不会重叠。
我发现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