2016-03-28 4 views
3

Я хотел был бы использовать стратегию разделения сплит-комбинаций dplyr для применения команды summary().Использование dplyr's do() с резюме()

Возьмем простой кадр данных:

df <- data.frame(class = c('A', 'A', 'B', 'B'), 
       value = c(100, 120, 800, 880)) 

В идеале мы хотели бы сделать что-то вроде этого:

df %>% 
    group_by(class) %>% 
    do(summary(.$value)) 

К сожалению, это не работает. Есть идеи?

ответ

4

Проблема в том, что dplyrdo() работает только с вводом формы data.frame.

tidy() Функция broom package «ы могут быть использованы для преобразования выходных сигналов summary() в data.frame.

df %>% 
    group_by(class) %>% 
    do(tidy(summary(.$value))) 

Это дает:

Source: local data frame [2 x 7] 
Groups: class [2] 

    class minimum q1 median mean q3 maximum 
    (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
1  A  100 105 110 110 115  120 
2  B  800 820 840 840 860  880 
2

Поведение do изменится в зависимости от того, присвоили ли вы именованный или неназванный аргумент. Для неназванных аргументов он ожидает файл данных для каждой группы, который будет привязан вместе. Для именованных аргументов он будет создавать строку для каждой группы и помещать все выходные данные в новую переменную с этим именем.

Так что в этом случае мы будем жаловаться на безымянное использовании (summary не производит data.frame), но названное использование будет работать:

df %>% 
    group_by(class) %>% 
    do(summaries = summary(.$value)) -> 
    df2 

Что дает:

Source: local data frame [2 x 2] 
Groups: <by row> 

    class     summaries 
    (fctr)      (chr) 
1  A <S3:summaryDefault, table> 
2  B <S3:summaryDefault, table> 

Мы могут получить доступ к следующим суммам:

df2$summaries[[1]] 

Предоставление:

Min. 1st Qu. Median Mean 3rd Qu. Max. 
100  105  110  110  115  120 

Получение всех этих, как новые столбцы для df может быть сделано только первые преобразования выходного сигнала в data.frame, как можно видеть в других ответах.

Таким образом, корень проблемы заключается в том, что summary выводит table вместо data.frame.

+1

спасибо, это здорово.Другой способ, с которым я только сталкивался, - использовать функцию 'tidy()' из пакета метлы. Но назвать это очень простой способ избежать этого. –

4

Вы можете использовать версию SE из data_frame, то есть data_frame_ и выполнять:

df %>% 
    group_by(class) %>% 
    do(data_frame_(summary(.$value))) 

В качестве альтернативы, вы можете использовать as.list() обернут data.frame() с аргументом check.names = FALSE:

df %>% 
    group_by(class) %>% 
    do(data.frame(as.list(summary(.$value)), check.names = FALSE)) 

Обе версии продукция:

# Source: local data frame [2 x 7] 
# Groups: class [2] 
# 
# class Min. 1st Qu. Median Mean 3rd Qu. Max. 
# (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
# 1  A 100  105 110 110  115 120 
# 2  B 800  820 840 840  860 880 
+0

Спасибо, этот выход выглядит идеально. Я немного читал о SE, но так и не понял. В какой пакет входят эти функции? Из использования '_' он выглядит как один из @hadley. Я также нашел способ использовать 'tidy()' из пакета метлы. Смотри ниже. –

+2

'data_frame' и' data_frame_' поступают из 'dplyr'. Между прочим, этот ответ заслуживает галочку, насколько мне известно. – Axeman

+0

Спасибо, это имеет смысл. И спасибо за добровольчество, что я изменил его. –

Смежные вопросы