2012-01-14 7 views
4

Si j'essaie d'obtenir une moyenne de c(NA, NA, 3, 4, 5, 6, 7, 8, 9, 10) en utilisant AVG à partir de SQL, j'obtiens une valeur de 5,2 au lieu de la valeur attendue de 6,5.Valeurs NA à l'aide de sqldf

# prepare data and write to file 
write.table(data.frame(col1 = c(NA, NA, 3:10)), 
     "my.na.txt", row.names = FALSE) 

mean(c(NA, NA, 3:10), na.rm = TRUE) # 6.5 

my.na <- read.csv.sql("my.na.txt", sep = " ", 
     sql = "SELECT AVG(col1) FROM file") # 5.2 

# this is identical to 
sum(3:10)/10 

unlink("my.na.txt") # remove file 

Ce qui me porte à croire que sql (df) traite les valeurs NA comme zéro. Est-il possible d'ignorer (exclure) les valeurs NA dans un appel SQL comme cela peut être fait en utilisant l'argument na.rm (en R)?

+1

'dit sqldf': « Les routines 'dbWriteTable/sqliteImportFile' que' sqldf' utilise pour transférer des fichiers vers la base de données sont destinées à la vitesse et ils ne sont pas aussi souples que 'read.table'. » Bien que ce ne soit peut-être pas la solution idéale, l'argument 'filter' de' read.csv.sql' peut être utilisé pour filtrer les lignes 'NA' avant qu'elles ne soient lues dans SQLite. Il y a quelques exemples de l'argument 'filter' dans'? Sqldf' et sur la page d'accueil de sqldf: http://sqldf.googlecode.com. –

Répondre

6

Modifier la recherche d'ignorer les valeurs NA:

SELECT AVG(col1) 
FROM file 
WHERE col1 IS NOT \"NA\" 
+0

Hum, j'utilise 'SELECT AVG (col1) FROM fichier WHERE col1 IS NOT NULL' et toujours obtenir 5.2. –

+1

sont les valeurs dans le DB N/A ou NULL? (sélectionnez col1 dans le fichier où col1 n'est pas nul) [faites apparaître les NA?] ou (sélectionnez Col1 dans le fichier où col1 <> 'NA' [faites apparaître les NA?] – xQbert

+0

Utilisation du fichier SELECT AVG (col1) FROM O WH col1 N'EST PAS \ "NA \" 'fonctionne bien et dandy.The astuce est que les NA sont cités, et vous avez besoin de leur échapper.Merci à la fois pour le pourboire –

2

Le problème est que la fonction read.csv.sql ne reconnaît pas les valeurs manquantes, et les convertit à zéro, au lieu de NULL. Cela ne se produit pas si vous chargez les données pour la première fois dans un data.frame, et appelez ensuite sqldf. ?

d <- read.csv("my.na.txt") 
sqldf("SELECT AVG(col1) FROM d") # 6.5 
+1

Chargement des données dans un data.frame est hors de la question dans mon cas. –

Questions connexes