выполнение plyr операции на каждой строке кадра данных в R

Мне нравится plyr синтаксис. Любое время я должен использовать один из *, применяет () команды, я заканчиваю тем, что ударил собаку и пошел на 3-дневный гибочный станок. Таким образом ради моей собаки и моей печени, что такое краткий синтаксис для того, чтобы сделать ddply операцию на каждой строке кадра данных?

Вот пример, который работает хорошо на простой случай:

x <- rnorm(10)
y <- rnorm(10)
df <- data.frame(x,y)
ddply(df,names(df) ,function(df) max(df$x,df$y))

это хорошо работает и дает мне, что я хочу. Но если вещи становятся более сложными, это заставляет plyr становиться броским (и не как Bootsy Collins), потому что plyr пережевывает создание "уровней" из всех тех значений с плавающей точкой

x <- rnorm(1000)
y <- rnorm(1000)
z <- rnorm(1000)
myLetters <- sample(letters, 1000, replace=T)
df <- data.frame(x,y, z, myLetters)
ddply(df,names(df) ,function(df) max(df$x,df$y))

на моем поле это жует в течение нескольких минут и затем возвращается:

Error: memory exhausted (limit reached?)
In addition: Warning messages:
1: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)

Я думаю, что полностью злоупотребляю plyr, и я не говорю, что это - ошибка в plyr, а скорее оскорбительное поведение мной (печень и собака, несмотря на это).

Таким образом короче говоря, есть ли ярлык синтаксиса для использования ddply для работы на каждую строку вместо apply(X, 1, ...)?

Обходное решение, которое я использовал, должно создать "ключ", который дает уникальное значение для каждой строки, и затем я могу соединить назад с ним.

 x <- rnorm(1000)
 y <- rnorm(1000)
 z <- rnorm(1000)
 myLetters <- sample(letters, 1000, replace=T)
 df <- data.frame(x,y, z, myLetters)
  #make the key
 df$myKey <- 1:nrow(df)
 myOut <- merge(df, ddply(df,"myKey" ,function(df) max(df$x,df$y)))
  #knock out the key
 myOut$myKey <- NULL

Но я продолжаю думать что "Должен Быть Лучший Путь"

Спасибо!

33
задан JD Long 15 January 2010 в 20:36
поделиться

1 ответ

Просто лечить его как массив и работать на каждом ряду:

adply(df, 1, transform, max = max(x, y))
43
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: