R, sqldf и avg для среднего отношения

Почему две команды дают разные результаты при использовании sqldf в R?

sqldf('select species,
    avg([Petal.Width]/[Petal.Length]) 
    as petalratio from iris group by species')

sqldf('select species,
    ([Petal.Width]/[Petal.Length]) 
    as petalratio from iris group by species')

При этом цель состоит в том, чтобы найти среднее соотношение для каждого из 3 видов.


person vashts85    schedule 05.07.2017    source источник


Ответы (1)


select species,
avg([Petal.Width]/[Petal.Length]) as petalratio 
from iris
group by species

Этот запрос выводит среднее значение для каждого вида, поскольку вы используете агрегатную функцию avg.

select species,
([Petal.Width]/[Petal.Length]) as petalratio 
from iris
group by species

Этот запрос случайным образом выводит одну строку для каждого вида, поскольку вы не используете агрегатную функцию. Это запрещено в большинстве баз данных, но разрешено в SQLite, которая является базой данных по умолчанию sqldf использует.

Вы должны использовать первый запрос с avg, поскольку это то, что вы пытаетесь сделать.

person Vamsi Prabhala    schedule 05.07.2017
comment
Удивительно, что нижний запрос не терпит неудачу. Ненадежные результаты. Другие СУБД поймут это. Но, конечно же, MySQL допускает only_full_group_by отключение, и новые пользователи знакомятся с SQL неправильно! - person Parfait; 06.07.2017
comment
В SQLite второй запрос выводит соотношение Petal.Width/Petal.Length для последней строки каждого вида. - person G. Grothendieck; 06.07.2017
comment
Оба этих комментария были очень полезны, особенно @G.Grothendieck! - person vashts85; 06.07.2017