ddply data r plyr

data - Aprendiendo a entender plyr, ddply



ddply in data table (3)

Encuentro que cuando tengo problemas para "visualizar" cómo funciona alguna de las herramientas funcionales en R, lo más fácil es buscar una sola instancia:

ddply(mydf, .(Model), function(x) browser() )

Luego inspecciona x en tiempo real y todo debería tener sentido. Luego puedes probar tu función en x, y si funciona, eres dorado (salvo que otras agrupaciones sean diferentes a tu primera x).

He estado intentando entender qué y cómo funciona plyr a través de probar diferentes variables y funciones y ver qué resultados. Así que estoy más buscando una explicación de cómo funciona plyr que un arreglo específico que responde. He leído la documentación pero mi cerebro de novato todavía no la está recibiendo.

Algunos datos y nombres:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e") ,c(1,2,3,10,20,30), c(5,10,20,20,15,10)) colnames(mydf)<-c("Model", "Class","Length", "Speed") mydf

Pregunta 1: Sintaxis de resumen frente a transformación

Así que si ddply(mydf, .(Model), summarise, sum = Length+Length) : ddply(mydf, .(Model), summarise, sum = Length+Length)

Yo obtengo:

`Model ..1 1 a 2 2 a 4 3 b 6 4 b 20 5 c 40 6 c 60

y si ingreso: ddply(mydf, .(Model), summarise, Length+Length) obtengo el mismo resultado.

Ahora si usa transform: ddply(mydf, .(Model), transform, sum = (Length+Length))

Yo obtengo:

Model Class Length Speed sum 1 a e 1 5 2 2 a e 2 10 4 3 b e 3 20 6 4 b e 10 20 20 5 c e 20 15 40 6 c e 30 10 60

Pero si lo ddply(mydf, .(Model), transform, (Length+Length)) como el primer resumen: ddply(mydf, .(Model), transform, (Length+Length))

Model Class Length Speed 1 a e 1 5 2 a e 2 10 3 b e 3 20 4 b e 10 20 5 c e 20 15 6 c e 30 10

Entonces, ¿por qué agregar "sum =" hace una diferencia?

Pregunta 2: ¿Por qué estos no funcionan?

ddply(mydf, .(Model), sum, Length+Length) # Error en la función (i): objeto ''Longitud'' no encontrado

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) :

2 argumentos pasados ​​a ''longitud'' que requieren 1

Estos ejemplos son más para mostrar que en algún lugar no entiendo fundamentalmente cómo usar plyr.

Cualquier respuesta o explicación son apreciadas.


La forma en que entiendo las ddply(... , .(...) , summarise, ...) están diseñadas para reducir el número de filas para que coincidan con el número de combinaciones distintas dentro de la agrupación .(...) variables Así que para tu primer ejemplo, esto parecía natural:

ddply(mydf, .(Model), summarise, sL = sum(Length) Model sL 1 a 3 2 b 13 3 c 50

DE ACUERDO. Parece que funciona para mí (no es un usuario habitual de plyr). Las operaciones de transform , por otro lado, entiendo que están haciendo nuevas columnas de la misma longitud que el marco de datos. Eso fue lo que tu primera llamada transform logró. Tu segundo (un fracaso) fue:

ddply(mydf, .(Model), transform, (Length+Length))

Ese no creó un nuevo nombre para la operación que se realizó, por lo que no hubo nada nuevo asignado en el resultado. Cuando agregó sum=(Length+Length) , repentinamente hubo un nombre disponible (y la función de sum no se usó). En general, es una mala idea usar los nombres de función para los nombres de columna.

En la pregunta dos, creo que el argumento .fun debe ser una función plyr o algo que tenga sentido aplicado a un marco de datos (dividido) en su totalidad en lugar de cualquier función antigua. No hay sum.data.frame función sum.data.frame . Pero ''nrow'' o ''ncol'' tienen sentido. Incluso puedes hacer que ''str'' trabaje en esa posición. La función de longitud aplicada a un marco de datos da el número de columnas:

ddply(mydf, .(Model), length ) # all 4''s


La sintaxis es:

ddply(data.frame, variable(s), function, optional arguments)

donde se espera que la función devuelva un data.frame . En tu situacion

  • Resumir es una función que creará de forma transparente un nuevo data.frame, con los resultados de la expresión que proporciona como argumentos adicionales (...)

  • transform, una función de base R, transformará los cuadros de datos (primera división por la (s) variable (s)), agregando nuevas columnas de acuerdo con la (s) expresión (s) que proporcione como argumentos adicionales. Estos necesitan ser nombrados, así es como funciona la transformación.

Si usa otras funciones que no sean subconjunto, transformar, mutar, con, dentro o resumir, deberá asegurarse de que devuelvan un data.frame (longitud y suma no), o al menos un vector de Longitud para la salida.