Значения NA с использованием sqldf

Если я попытаюсь получить среднее значение 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)?


person Roman Luštrik    schedule 14.01.2012    source источник
comment
?sqldf говорит: Подпрограммы dbWriteTable/sqliteImportFile, которые sqldf использует для передачи файлов в базу данных, предназначены для скорости и не так гибки, как read.table. Хотя, возможно, это и не идеальное решение, аргумент filter для read.csv.sql можно использовать для фильтрации строк NA до того, как они будут прочитаны в SQLite. Несколько примеров аргумента filter в ?sqldf и на главной странице sqldf: sqldf.googlecode.com .   -  person G. Grothendieck    schedule 14.01.2012


Ответы (3)


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

SELECT AVG(col1)
FROM file
WHERE col1 IS NOT \"NA\"
person mathematical.coffee    schedule 14.01.2012
comment
Хм, я использую SELECT AVG(col1) FROM file WHERE col1 IS NOT NULL и все еще получаю 5.2. - person Roman Luštrik; 14.01.2012
comment
значения в БД N/A или NULL? (выберите col1 из файла, где col1 не равен нулю) [отображаются ли NA?] или (выберите Col1 из файла, где col1 ‹› 'NA' [отображаются NA?] - person xQbert; 14.01.2012
comment
Использование SELECT AVG(col1) FROM file WHERE col1 IS NOT \"NA\" прекрасно работает. Хитрость в том, что NA указаны в кавычках, и вам нужно их избегать. Спасибо вам обоим за подсказку. - person Roman Luštrik; 14.01.2012

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

d <- read.csv("my.na.txt")
sqldf("SELECT AVG(col1) FROM d") # 6.5
person Vincent Zoonekynd    schedule 14.01.2012
comment
О загрузке данных в data.frame в моем случае не может быть и речи. - person Roman Luštrik; 14.01.2012

Для дальнейшего использования. Я нашел эту ветку при исследовании вопроса, решение можно найти в определении NA. При передаче в SQLite NA преобразуются в NULL, а затем вы можете использовать IS NULL или IS NOT NULL, чтобы исключить их.

person Fredrik Karlsson    schedule 21.04.2021