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

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

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: In mean.default (piece, ...): аргумент не является числовым или логическим: возвращается NA

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

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


person ivan    schedule 16.04.2019    source источник
comment
В вашем первом примере вы вызываете summarize, который ожидает фрейм; последующие аргументы (mSpeed, ...) затем являются аргументами для summarize, поэтому результирующий вызов может быть summarize(x, mSpeed=mean(Speed), mLength=mean(Length)). Во втором вызове вы пытаетесь передать полный кадр mean, когда ему действительно нужен только вектор. Я не знаю, почему вы предпочли бы указывать его по одному (так как это не будет быстрее), но ddply(mydf, .(Model, Class), .fun = summarize, mSpeed=mean(Speed)) - по одному.   -  person r2evans    schedule 17.04.2019
comment
Я хочу сказать, что mSpeed ​​дает мне лишь среднее значение скорости. Что, если бы в mydf было 20 числовых столбцов. Могу ли я использовать его для получения среднего значения каждого из этих столбцов, разделенных по модели и классу   -  person ivan    schedule 17.04.2019


Ответы (1)


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



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 & 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

Создано 16 апреля 2019 г. пакетом REPEX (v0.2.1)

person Ryan John    schedule 16.04.2019
comment
Пожалуйста, посмотрите мое обновление сообщения. Я хочу сделать это с ddply. - person ivan; 17.04.2019