2010-10-14 9 views
1

Lorsque j'importe des données de pays à l'aide de RODBC, j'utilise souvent des codes ISO2. La partie malheureuse est la Namibie avec ISO2 "NA" est toujours mis à manquer. Bien sûr, il y a plusieurs façons de contourner cela, mais je me demande si quelqu'un a trouvé un moyen d'importer correctement. J'ai essayéImportation RODBC pour conserver "NA"

df <- sqlFetch(ch,"data_from_database", na.strings="") 
df <- sqlFetch(ch,"data_from_database", as.is) 

en vain. Des conseils?

+0

essayé avec as.is = T? –

+2

Le premier devrait fonctionner. Quelles sont vos versions de R, RODBC et quelle base de données utilisez-vous? – Marek

+0

as.is = T ne semble pas fonctionner non plus. J'utilise R version 2.10.1 et RODBC 1.3-1. Ma base de données est sur SQL Server, mais j'ai le même problème d'importation à partir d'Excel via RODBC. – Tom

Répondre

1

HA! Eh bien as.is = T ne fonctionne pas, na.string = "" ne fonctionne pas, mais avec leurs puissances combinées ...

> ch <- odbcConnectExcel("m.xls") 
> s <- sqlFetch(ch, "m", as.is=T) 
> close(ch) 
> s 
    iso2 value 
1 GB 87 
2 <NA> 456 
3 IN 423 
> ch <- odbcConnectExcel("m.xls") 
> r <- sqlFetch(ch, "m", na.string="") 
> close(ch) 
> r 
    iso2 value 
1 GB 87 
2 <NA> 456 
3 IN 423 
> ch <- odbcConnectExcel("m.xls") 
> n <- sqlFetch(ch, "m", as.is=T, na.string="") 
> close(ch) 
> n 
    iso2 value 
1 GB 87 
2 NA 456 
3 IN 423 
+0

Cela ressemble à un "bug" dans 'sqlGetResults'. J'ai vérifié la source et il semble que 'na.string' ne soit pas passé à' type.convert' utilisé dans 'sqlGetResults'. – Marek

1

La plupart des chargeurs de bases de données appellent finalement read.table(). Donc, dans un premier temps, abordons cela.

Avec un fichier de données tom.csv comme

country,value 
GB,55 
NA,77 
CH,23 

Je reçois

R> read.csv("/tmp/tom.csv") 
    country value 
1  GB 55 
2 <NA> 77 
3  CH 23 
R> read.csv("/tmp/tom.csv", na.string="#") 
    country value 
1  GB 55 
2  NA 77 
3  CH 23 
R> 

si simple réglage na.string à une valeur différente était suffisante. Essayez-le avec sqlQuery() qui est plus directement utile que sqlFetch().

+0

Merci, Dirk. Votre solution fonctionne très bien pour read.csv, mais la même chose ne fonctionne pas avec sqlFetch ou sqlQuery. Peut-être que c'est une sorte de bug? En attendant, je vais continuer à utiliser ma fonction de contournement. – Tom