Импортировать файл .dat из хранилища, используя R - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы импортировать этот набор данных в df. Я пытаюсь преобразовать этот файл поддержки SAS в код R, используя read.fwf подход

Определите имя и длину переменных, как описано в файле SAS

vars <- c('SEQN',   'HYK1A',    'HYK1B',    'HYK2A',    'HYK2B',    'HYK3CG',   'HYK3DG',   'HYK6SG',   'HYK8SG',   'HYK3CH',   'HYK3DH',   'HYK6SH',   'HYK8SH',   'HYK3CI',   'HYK3DI',   'HYK6SI',   'HYK8SI',   'HYK3CJ',   'HYK3DJ',   'HYK6SJ',   'HYK8SJ',   'HYK3CK',   'HYK3DK',   'HYK6SK',   'HYK8SK',   'HYK3CL',   'HYK3DL',   'HYK6SL',   'HYK8SL',   'HYK3CM',   'HYK3DM',   'HYK6SM',   'HYK8SM',   'HYK3CN',   'HYK3DN',   'HYK6SN',   'HYK8SN',   'HYK3CO',   'HYK3DO',   'HYK6SO',   'HYK8SO',   'HYK3CP',   'HYK3DP',   'HYK6SP',   'HYK8SP',   'HYK9DG',   'HYK9EG',   'HYK9FG',   'HYK11AG',  'HYK12SG',  'HYK9DH',   'HYK9EH',   'HYK9FH',   'HYK11AH',  'HYK12SH',  'HYK9DI',   'HYK9EI',   'HYK9FI',   'HYK11AI',  'HYK12SI',  'HYK9DJ',   'HYK9EJ',   'HYK9FJ',   'HYK11AJ',  'HYK12SJ',  'HYK9DK',   'HYK9EK',   'HYK9FK',   'HYK11AK',  'HYK12SK',  'HYK9DL',   'HYK9EL',   'HYK9FL',   'HYK11AL',  'HYK12SL',  'HYK9DM',   'HYK9EM',   'HYK9FM',   'HYK11AM',  'HYK12SM',  'HYK9DN',   'HYK9EN',   'HYK9FN',   'HYK11AN',  'HYK12SN',  'HYK9DO',   'HYK9EO',   'HYK9FO',   'HYK11AO',  'HYK12SO')
len <-c(7,  3,  3,  3,  3,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  3,  3,  4,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4,  4,  4,  4,  6,  4)

получение DF из сети

df <- read.fwf(".../you.dat",
                    widths = len, header = FALSE, n=10, stringsAsFactors = TRUE)
names(df) <- vars

Визуализация DF

head(df)

Честно говоря, я не доверяю этому DF. Я получаю слишком много NAs

Обновление после @ 42- светящегося ответа. Быстрее

Я легко улучшил свой код, используя библиотеку SAScii, и она работает. Тем не менее, я нашел что-то быстрее с меньшими системными затратами здесь .

library(readr)
library(data.table)

#Parse SAS file
vars <- parse.SAScii(".../you.sas")

setDT(vars) #convert to data.table

#read to data frame
huge.df <- read_fwf(".../you.dat", 
                     fwf_widths(dput(vars[,width]),
                                col_names=(dput(vars[,varname]))),
                     progress = interactive()
)

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

С пакетом SAScii это может быть легко выполнено в виде однострочной строки в общем виде: read.SAScii (набор данных, sascode, zipped = F) . Например:

mydata <- read.SAScii (".../you.dat", ".../you.sas", zipped = F)
0 голосов
/ 11 мая 2018

Несколько лет назад я тоже попытался сделать это и в конце концов соединил метод, но в то же время @AnthonyDamico написал пакет SAScii, и все эти усилия теперь не нужны.Спасибо, Энтони, за все твои отличные усилия по предоставлению общедоступных данных пользователям R.Я подозреваю, что вы сэкономили Фонду Кайзера сотни тысяч долларов в течение своей трудовой и консультационной карьеры.

library(SAScii)
youth.tf <- tempfile()
daturl <- "https://wwwn.cdc.gov/nchs/data/nhanes3/2a/youthk.dat"
code_url ="https://wwwn.cdc.gov/nchs/data/nhanes3/2a/youthk.sas"
Sas_code <- url(code_url)
writeLines ( readLines(Sas_code) , con = youth.tf )
youth.fwf.parameters <- parse.SAScii( youth.tf , beginline = 5 )
str( youth.fwf.parameters )
#-----
'data.frame':   90 obs. of  4 variables:
 $ varname: chr  "SEQN" "HYK1A" "HYK1B" "HYK2A" ...
 $ width  : num  5 1 1 2 2 2 2 4 4 2 ...
 $ char   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ divisor: num  1 1 1 1 1 1 1 1 1 1 ...
#------

daturl <- "https://wwwn.cdc.gov/nchs/data/nhanes3/2a/youthk.dat"
in.youth <- read.fwf(daturl, widths=youth.fwf.parameters$width,
                       col.names= youth.fwf.parameters$varname)

Боюсь, что есть довольно много АН, и, похоже, ваш код был в основном успешно.

str(in.youth)
'data.frame':   13944 obs. of  90 variables:
 $ SEQN   : int  7 12 13 14 16 20 21 23 26 27 ...
 $ HYK1A  : int  1 1 2 2 2 2 1 2 2 2 ...
 $ HYK1B  : int  2 2 2 2 2 2 2 2 2 2 ...
 $ HYK2A  : int  1 1 NA NA NA NA 1 NA NA NA ...
 $ HYK2B  : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK3CG : int  1 3 NA NA NA NA 4 NA NA NA ...
 $ HYK3DG : int  2 3 NA NA NA NA 2 NA NA NA ...
 $ HYK6SG : int  30 30 NA NA NA NA 30 NA NA NA ...
 $ HYK8SG : int  24 1 NA NA NA NA 24 NA NA NA ...
 $ HYK3CH : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK3DH : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK6SH : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK8SH : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK3CI : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK3DI : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HYK6SI : int  NA NA NA NA NA NA NA NA NA NA ...
.... snipped the rest of the 90 variables

Я вижу только эти данные, которые, возможно, содержат недопустимые данные, и они выглядят некорректно загруженными:

 HYK11AG: Factor w/ 179 levels "      ","003.9 ",
HYK11AH: Factor w/ 108 levels "      ","011.9 ",
HYK11AK: Factor w/ 12 levels "      ","079.9 ",

Похоже, это ICD-Коды 9-СМ, которые должны были быть считаны в R в символьном формате, но для которых не было надлежащих $ записей в операторах INPUT в коде SAS CDC.Вы можете получить полный набор диагностики с помощью функции "read.SAScii":

in2 <- read.SAScii( daturl, code_url)

. Вы можете проверить количество значений не-NA по сравнению со значениями, указанными в кодовой книге по адресу: https://wwwn.cdc.gov/nchs/data/nhanes3/1a/YOUTH-acc.pdf

Это частичный снимок экрана страницы 210 этой кодовой книги, показывающий, что для трех переменных "HYK__" на этой странице должны быть все NA:

enter image description here

Примечание добавлено для развлечения.Теперь это на самом деле контр-пример своего рода состояния.В этом пакете довольно много элементов, ссылающихся на SAS (часто в менее чем благоприятном свете), и мне потребовалось 7 или 8 попыток, прежде чем был найден тот, который я искал:

fortunes::fortune("SAS")

Jim Gustafsson: I would like to put my SAS-code into R. Could I do that,
if yes, how?
Frank Harrell: Just reverse the procedure you use when you put R code into
SAS. ;)
   -- Jim Gustafsson and Frank Harrell
      R-help (February 2004)
...