Мне нравится синтаксис 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
Но я продолжаю думать, что «Должен быть лучший путь»
Спасибо!