Domanda

Mi piace la sintassi plyr. Ogni volta che devo utilizzare uno dei * verificare) comandi (io alla fine a calci il cane e andando su un bender tre giorni. Così, per il bene del mio cane e il mio fegato, che cosa è la sintassi concisa per fare un'operazione ddply su ogni riga di un frame di dati?

Ecco un esempio che funziona bene per un caso semplice:

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

che funziona bene e mi dà quello che voglio. Ma se le cose si fanno più complesse questo provoca plyr per ottenere funky (e non come Bootsy Collins), perché plyr è masticare a fare "livelli" di tutti quei valori in virgola mobile

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))

sulla mia casella di questo mastica per qualche minuto e poi ritorna:

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)

Credo che io sono totalmente abusando plyr e non sto dicendo che questo è un bug in plyr, ma il comportamento piuttosto abusiva da me (fegato e il cane in deroga).

Così, in breve, c'è scorciatoia sintassi per l'utilizzo ddply di operare su ogni riga come un sostituto per apply(X, 1, ...)?

La soluzione che ho usato è quello di creare una "chiave" che dà un valore univoco per ogni riga e poi mi possono aderire di nuovo esso.

 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

Ma io continuo a pensare che "ci deve essere un modo migliore"

Grazie!

È stato utile?

Soluzione

Proprio trattarlo come un array e lavorare su ogni riga:

adply(df, 1, transform, max = max(x, y))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top