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

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

Мне нравится синтаксис plyr. Каждый раз, когда я должен использовать одну из команд * apply(), я в конечном итоге пинаю собаку и иду на 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

Но я продолжаю думать, что "должно быть лучше"

Спасибо!

4b9b3361

Ответ 1

Просто рассматривайте его как массив и работайте над каждой строкой:

adply(df, 1, transform, max = max(x, y))