2013-05-23 2 views
5

Recentemente ho scaricato alcuni dati in formato ASCII che è venuto con i file di installazione SAS che vorrei usare con R. Uno di questi file di dati è qui:R - Importazione di dati ASCII utilizzando un file dizionario .sas e SAScii

https://dl.dropboxusercontent.com/u/8474088/Data.txt

con i corrispondenti file di installazione SAS qui:

https://dl.dropboxusercontent.com/u/8474088/Setup.sas

Vorrei sottolineare che il file di installazione è progettato per funzionare con circa 50 dati diversi file tutti con struttura simile (t il link sopra è un esempio di uno di questi).

Pensavo di essere in buona forma dopo aver trovato il pacchetto SAScii ma non sono riuscito a ottenere la lettura.SAScii o parse.SAScii per lavorare con questi file. Entrambi i comandi danno un errore.

read.SAScii(data.file,setup.file,beginline=581) 

Error in if (as.numeric(x[j, "start"]) > as.numeric(x[j - 1, "end"]) + : 
    missing value where TRUE/FALSE needed 
In addition: Warning message: 
NAs introduced by coercion 

parse.SAScii(setup.file,beginline=581) 

Error in if (as.numeric(x[j, "start"]) > as.numeric(x[j - 1, "end"]) + : 
    missing value where TRUE/FALSE needed 
In addition: Warning message: 
NAs introduced by coercion 

Gli esempi nell'uso documentazione SAScii file di installazione molto più semplice così mi chiedo se la complessità del file di cui sopra è la causa del problema (ad esempio le informazioni sul valore elencato nel file prima del comando INPUT).

Qualsiasi idea su come procedere sarebbe grandiosa. Grazie in anticipo.

+0

Grazie per aver notato. Ho appena cambiato i collegamenti che dovrebbero funzionare ora. –

+1

Basta fare un rapido tentativo qui - ottenere gli stessi risultati indipendentemente dal fatto di giocare con alcune opzioni/modifiche. Potrebbe essere necessario mordere il proiettile e usare '? Read.fwf' manualmente per aspirare i dati. Questo è essenzialmente ciò che 'read.SAScii' fa internamente comunque. I formati di file SAS sono noti per avere bizzarre eccezioni alla struttura standard, quindi non sentirti male. – thelatemail

+0

Apprezzo che abbiate dato un'occhiata. Ho anche creato alcuni file di installazione modificati per cercare di farlo funzionare, ma penso che sia necessario il lungo pre-ampio prima che la roba INPUT sia necessaria. Ad essere sincero, posso sempre usare SAS per farlo nei laboratori informatici a scuola (si spera, visto che non ho mai usato SAS). Tuttavia, sono anche un grande fan dell'elegante soluzione R che può eludere l'intero contratto di licenza. Grazie. –

risposta

3

come indicato nello details section of the parse.SAScii help, questo pacchetto non può leggere colonne sovrapposte .. e il file lo ha chiaramente. ;) affinché SAScii funzioni, è necessario suddividere il file .sas in quattro file .sas separati sul disco rigido. ecco come-

# load all necessary libraries 
library(stringr) 
library(SAScii) 
library(downloader) 

# create two temporary files 
tf <- tempfile() 
tf2 <- tempfile() 

# download the sas import script 
download("https://dl.dropboxusercontent.com/u/8474088/Setup.sas" , tf) 

# download the actual data file 
download("https://dl.dropboxusercontent.com/u/8474088/Data.txt" , tf2) 

# read the sas importation instructions into R 
z <- readLines(tf) 

# here are the break points 
z[ substr(str_trim(z) , 1 , 1) == '#' ] 

sas.script.breakpoints <- which(substr(str_trim(z) , 1 , 1) == '#') 

script.one <- z[ 581:sas.script.breakpoints[1] ] 
script.two <- z[ sas.script.breakpoints[1]:sas.script.breakpoints[2] ] 
script.three <- z[ sas.script.breakpoints[2]:sas.script.breakpoints[3] ] 
script.four <- z[ sas.script.breakpoints[3]:length(z) ] 

# replace some stuff so these look like recognizable sas scripts 
script.one[ length(script.one) ] <- ";" 

script.two[ 1 ] <- "input blank 1-300" 
script.two[ length(script.two) ] <- ";" 

script.three[ 1 ] <- "input blank 1-300" 
script.three[ length(script.three) ] <- ";" 

script.four[ 1 ] <- "input blank 1-300" 

# test then import data set one 
writeLines(script.one , tf) 
parse.SAScii(tf) 
x1 <- read.SAScii(tf2 , tf) 

# test then import data set two 
writeLines(script.two , tf) 
parse.SAScii(tf) 
x2 <- read.SAScii(tf2 , tf) 

# test then import data set one 
writeLines(script.three , tf) 
parse.SAScii(tf) 
x3 <- read.SAScii(tf2 , tf) 

# test then import data set four 
writeLines(script.four , tf) 
parse.SAScii(tf) 
x4 <- read.SAScii(tf2 , tf) 
+0

Ho finito per utilizzare SAS a scuola per ottenere i dati (eseguendo il looping dei singoli file ed esportandoli in .csv). Tuttavia, la fonte di dati che uso è standard nel fornire file di dati in formato .txt con i file .sas per le impostazioni in modo da poterlo provare in futuro. Grazie per l'aiuto. –

+1

non c'è niente da provare. il codice sopra fa tutto il lavoro per te;) –

+1

Alla fine ho avuto una ragione per usare questo (su qualcosa di leggermente diverso) e ha funzionato alla grande. Grazie. –