#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
помощью .