Как ddply разделяет данные?

#r #plyr

#r #plyr

Вопрос:

У меня есть этот фрейм данных.

 mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")
 

Я пытаюсь лучше понять, как работает ddply.

Я хотел бы получить среднюю длину и скорость для каждой пары модели и класса.

Я знаю, что это один из способов сделать это : ddply(mydf, .(Model, Class), .fun = summarize, mSpeed = mean(Speed), mLength = mean(Length)) .

Интересно, смогу ли я получить среднее значение, используя ddply и не указывая его по одному за раз.

Я пытался ddply(mydf, .(Model, Class), .fun = mean) , но получаю сообщение об ошибке

Предупреждающие сообщения: 1: В mean.default(piece, …) : аргумент не является числовым или логическим: возвращает NA

Что ddply передается в аргумент функции? Есть ли способ применить одну функцию к каждому используемому столбцу ddply ?

Моя цель — узнать больше о ddply . Я буду принимать только ответы ddply

Комментарии:

1. В вашем первом примере вы вызываете summarize , который ожидает фрейм; последующие аргументы ( mSpeed , …) затем являются аргументами summarize , поэтому результирующий вызов может быть summarize(x, mSpeed=mean(Speed), mLength=mean(Length)) . В вашем втором вызове вы пытаетесь передать полный кадр mean , когда ему действительно нужен только вектор. Я не знаю, почему вы предпочли бы «указывать их по одному» (поскольку это не будет быстрее), но по одному за раз ddply(mydf, .(Model, Class), .fun = summarize, mSpeed=mean(Speed)) .

2. Я хочу сказать, что mSpeed дает мне только среднее значение скорости. Что, если в mydf было 20 числовых столбцов. Могу ли я использовать его для получения среднего значения каждого из этих столбцов, разделенного по модели и классу

Ответ №1:

Вот решение, использующее dplyr summarize функцию and .

 

library(dplyr)


mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")

#summarize data by Model amp; Class
mydf %>%  group_by(Model, Class) %>% summarize_if(is.numeric, mean)


#> # A tibble: 3 x 4
#> # Groups:   Model [3]
#>   Model Class Length Speed
#>   <fct> <fct>  <dbl> <dbl>
#> 1 a     e        1.5   7.5
#> 2 b     e        6.5  20  
#> 3 c     e       25    12.5
 

Создано 2019-04-16 пакетом reprex (версия 0.2.1)

Комментарии:

1. Пожалуйста, посмотрите мое обновление к сообщению. Я бы хотел сделать это с ddply помощью .