Подтвердить что ты не робот

Научиться понимать plyr, ddply

Я пытаюсь понять, что и как работает plyr, используя различные переменные и функции и видя, какие результаты. Поэтому я больше ищу объяснение того, как работает 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")
mydf

Вопрос 1: Обобщение синтаксиса трансформации

Итак, если я вхожу: ddply(mydf, .(Model), summarise, sum = Length+Length)

Я получаю:

`Model ..1
1     a   2
2     a   4
3     b   6
4     b  20
5     c  40
6     c  60

и если я введу: ddply(mydf, .(Model), summarise, Length+Length), я получаю тот же результат.

Теперь, если использование преобразования: ddply(mydf, .(Model), transform, sum = (Length+Length))

Я получаю:

  Model Class Length Speed sum
1     a     e      1     5   2
2     a     e      2    10   4
3     b     e      3    20   6
4     b     e     10    20  20
5     c     e     20    15  40
6     c     e     30    10  60

Но если я сформулирую это как первое обобщение: ddply(mydf, .(Model), transform, (Length+Length))

  Model Class Length Speed
1     a     e      1     5
2     a     e      2    10
3     b     e      3    20
4     b     e     10    20
5     c     e     20    15
6     c     e     30    10

Итак, почему добавление "sum =" имеет значение?

Вопрос 2: Почему это не работает?

ddply(mydf, .(Model), sum, Length+Length) #Error в функции (i): объект "Длина" не найден

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

2 аргумента передаются в длину, для которой требуется 1

Эти примеры больше показывают, что где-то я принципиально не понимаю, как использовать plyr.

Приветствуются любые объяснения или объяснения.

4b9b3361

Ответ 1

Синтаксис:

ddply(data.frame, variable(s), function, optional arguments)

где ожидается, что функция вернет a data.frame. В вашей ситуации

  • summary - это функция, которая будет прозрачно создавать новый data.frame с результатами выражения, которое вы предоставляете в качестве дополнительных аргументов (...)

  • transform, базовая функция R, преобразует data.frames(сначала разбивается на переменные (ы)), добавляя новые столбцы в соответствии с выражением (выражениями), которое вы предоставляете в качестве дополнительных аргументов. Они должны быть названы, что просто способ преобразования работает.

Если вы используете другие функции, а не подмножество, преобразовываете, мутируете, включаете или суммируете, вам нужно убедиться, что они возвращают data.frame(длина и сумма не входят) или, по крайней мере, вектор соответствующей длины для выхода.

Ответ 2

Я обнаружил, что когда у меня возникают проблемы с "визуализацией" того, как работает любой из функциональных инструментов в работе R, то проще всего сделать браузер одним экземпляром:

ddply(mydf, .(Model), function(x) browser() )

Затем проверьте x в режиме реального времени, и все должно иметь смысл. Затем вы можете проверить свою функцию на x, и если она будет работать, вы будете золотыми (если другие группы не будут отличаться от вашего первого x).

Ответ 3

Как я понимаю, операции ddply(... , .(...) , summarise, ...) предназначены для уменьшения количества строк в соответствии с количеством различных комбинаций внутри переменных группировки .(...). Итак, для вашего первого примера это казалось естественным:

ddply(mydf, .(Model), summarise, sL = sum(Length)
  Model sL
1     a  3
2     b 13
3     c 50

OK. Кажется, работает для меня (не обычный пользователь plyr). С другой стороны, операции transform я понимаю, создавая новые столбцы той же длины, что и dataframe. Это был ваш первый вызов transform. Ваш второй (неудача):

ddply(mydf, .(Model), transform, (Length+Length))

Это не создало новое имя для выполняемой операции, поэтому в результате ничего нового не было назначено. Когда вы добавили sum=(Length+Length), неожиданно появилось имя (и функция sum не использовалась). Как правило, плохая идея использовать имена функций для имен столбцов.

По второму вопросу, я думаю, что аргумент .fun должен быть plyr-функцией или чем-то, что имеет смысл применительно к (split) dataframe в целом, а не к любой старой функции. Нет функции sum.data.frame. Но "nrow" или "ncol" имеют смысл. Вы можете даже заставить "str" работать в этой позиции. Функция длины, применяемая к кадру данных, дает количество столбцов:

 ddply(mydf, .(Model), length )  # all 4's