Pregunta haciendo una operación plyr en cada fila de un marco de datos en R


Me gusta la sintaxis plyr. Cada vez que tengo que usar uno de los comandos de * apply () termino pateando al perro y yendo a un doblador de 3 días. Entonces, por el bien de mi perro y mi hígado, ¿cuál es la sintaxis concisa para realizar una operación ddply en cada fila de un marco de datos?

Aquí hay un ejemplo que funciona bien para un caso simple:

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

eso funciona bien y me da lo que quiero. Pero si las cosas se vuelven más complejas, esto hace que plyr se vuelva funky (y no como Bootsy Collins) porque plyr está masticando para hacer "niveles" de todos esos valores de coma flotante

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

en mi caja esto mastica durante unos minutos y luego regresa:

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)

Creo que estoy abusando totalmente de plyr y no estoy diciendo que esto sea un error en plyr, sino un comportamiento abusivo por mi parte (a pesar del hígado y el perro).

En resumen, ¿hay un atajo de sintaxis para usar ddply para operar en cada fila como un sustituto de apply(X, 1, ...)?

La solución que he estado usando es crear una "clave" que da un valor único para cada fila y luego puedo unirme a ella.

 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

Pero sigo pensando que "tiene que haber un mejor camino"

¡Gracias!


32
2018-01-15 20:36


origen


Respuestas:


Simplemente trátelo como una matriz y trabaje en cada fila:

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

42
2018-01-15 21:17