выполнение операции plyr для каждой строки кадра данных в R - PullRequest
33 голосов
/ 15 января 2010

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

Но я продолжаю думать, что «Должен быть лучший путь»

Спасибо!

1 Ответ

43 голосов
/ 16 января 2010

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

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