2015-06-02 1 views
1

Почему y заканчивается как character класс? Похоже, это никогда не должно происходить от sqldf SUM?Почему эта команда GROUP BY и NA генерирует символ?

library(sqldf) 

# three very similar data.frame objects 
x <- structure(list(size = c(1L, 2L), diff = c(1, NA)) , .Names = c("gb","diff"), row.names = 1:2, class = "data.frame") 
y <- structure(list(size = c(1L, 1L, 2L, 2L), diff = c(NA, NA, 1, NA)) , .Names = c("gb","diff"), row.names = 1:4, class = "data.frame") 
z <- structure(list(size = c(2L, 2L, 1L, 1L), diff = c(NA, NA, 1, NA)) , .Names = c("gb","diff"), row.names = 1:4, class = "data.frame") 


# when summed in sqldf: numeric, character, numeric 
sapply(sqldf("select sum(diff) from x"),class) 
sapply(sqldf("select sum(diff) , gb from y group by gb"),class)[1] 
sapply(sqldf("select sum(diff) , gb from z group by gb"),class)[1] 



# this despite both being numeric originally 
class(x$diff) 
class(y$diff) 
+0

Если удалить, что 'сумма()' и оставить только 'diff' результатов, как и ожидалось (как цифровая). Я не знаю sql и так суммарно. В R 'sum' является общей функцией для суммирования элементов. Возможно, команды R внутри 'sqldf' функций должны быть помещены в специальную функцию или что-то еще? – SabDeM

+0

Я думаю, что это применимо: sqldf FAQ 14: https://github.com/ggrothendieck/sqldf#14-how-does-one-read-files-where-numeric-nas-are-represented-as-missing-empty- поля –

+0

@BondedDust спасибо! это, вероятно, часть проблемы. я представил слегка уточненную проблему, но я должен просто написать обход :) https://github.com/ggrothendieck/sqldf/issues/2 –

ответ

3

Исключить NA, (то есть: NULL) перед агрегирование:

out1 <- sqldf("SELECT SUM(diff) AS diff_sum 
       FROM x 
       WHERE diff IS NOT NULL") 

out2 <- sqldf("SELECT SUM(diff) AS diff_sum, gb 
       FROM y 
       WHERE diff IS NOT NULL 
       GROUP BY gb") 

str(out1) 
# 'data.frame': 1 obs. of 1 variable: 
# $ diff_sum: num 1 
str(out2) 
# 'data.frame': 1 obs. of 2 variables: 
# $ diff_sum: num 1 
# $ gb  : int 2 
1

This is the correct way to avoid this.

@ G.Grothendieck:

sqldf имеет эвристический, который Установите класс в любом столбце вывода должен быть того же класса, что и вход столбец с тем же именем, так это было бы исправить:

str(y) 
## 'data.frame': 4 obs. of 2 variables: 
## $ gb : int 1 1 2 2 
## $ diff: num NA NA 1 NA 

out1 <- sqldf("select sum(diff) diff, gb from y group by gb") 
str(out1) 
## 'data.frame': 2 obs. of 2 variables: 
## $ diff: num NA 1 
## $ gb : int 1 2 

out2 <- sqldf("select sum(diff) diff, gb from y group by gb ORDER BY gb desc") 
str(out2) 
## 'data.frame': 2 obs. of 2 variables: 
## $ diff: num 1 NA 
## $ gb : int 2 1 
+0

@ G.Grothendieck означает, что мы не можем переименовать выходную переменную , например, 'diff_sum' и иметь его как числовое? – zx8754