Значения NA с использованием sqldf - PullRequest
4 голосов
/ 14 января 2012

Если я пытаюсь получить среднее значение c(NA, NA, 3, 4, 5, 6, 7, 8, 9, 10) с использованием AVG из SQL, я получаю значение 5,2 вместо ожидаемого 6,5.

# 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

Что наводит меня на мысль, что sql (df) рассматривает значения NA как ноль. Можно ли игнорировать (исключать) значения NA в вызове SQL, как это можно сделать с помощью аргумента na.rm (в R)?

Ответы [ 2 ]

7 голосов
/ 14 января 2012

Измените ваш запрос, чтобы игнорировать значения NA:

SELECT AVG(col1)
FROM file
WHERE col1 IS NOT \"NA\"
2 голосов
/ 14 января 2012

Проблема в том, что функция read.csv.sql не распознает пропущенные значения и преобразует их в ноль вместо NULL.Этого не произойдет, если вы сначала загрузите данные в data.frame, а только потом вызовете sqldf.

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