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