2012-07-06 40 views
21

He estado tratando de entender qué y cómo funciona plyr probando diferentes variables y funciones y viendo qué resultados. Así que estoy más buscando una explicación de cómo funciona plyr que la solución específica que responde. He leído la documentación, pero mi cerebro de novato aún no la está obteniendo.Aprendiendo a comprender plyr, ddply

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: Resumir frente Transformar Sintaxis

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

me sale:

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

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

Ahora bien, si el uso transformar: ddply(mydf, .(Model), transform, sum = (Length+Length))

me sale:

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 digo que al igual que 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é la adición de "suma = " ¿Hacer la diferencia?

Pregunta 2: ¿Por qué no funcionan?

ddply(mydf, .(Model), sum, Length+Length) # error en función de (i): objeto 'Longitud' no encontraron

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

2 argumentos pasados ​​a 'longitud', que requiere de 1

Estos ejemplos son más para mostrar que en alguna parte I' m fundamentalmente no entendiendo cómo usar plyr.

Se agradecen todos los informes o explicaciones.

Respuesta

18

La sintaxis es la siguiente:

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

donde se espera que la función devuelva un data.frame. En su situación,

  • Resumir es una función que de forma transparente creará un nuevo hoja.de.datos, con los resultados de la expresión que se proporcionan como otros argumentos (...)

  • transformar una la función base R, transformará los data.frames (primero divididos por la (s) variable (s)), agregando nuevas columnas según la (s) expresión (es) que proporcione como argumentos adicionales. Estos deben ser nombrados, así es como funciona la transformación.

Si utiliza otras funciones de subconjunto, transformar, mutar, con, dentro, o resumir, que necesita para asegurarse de que devuelven un hoja.de.datos (longitud y suma NO), o por lo al menos un vector de longitud apropiada para la salida.

+1

Además, creo que el primer conjunto de ejemplos en el OP es simplemente la diferencia en el comportamiento predeterminado entre 'summmarise' y' transform' si omite incluir una etiqueta como 'val =' en la expresión. 'summarise' aparentemente proporcionará su propio nombre, mientras que' transform' parece ignorarlo. – joran

4

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

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

OK. Parece que funciona para mí (no es un usuario regular de plyr). Las operaciones transform, por otro lado, entiendo que estoy haciendo nuevas columnas de la misma longitud que el marco de datos. Eso fue lo que logró su primera llamada transform. Su segundo (un fracaso) fue:

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

Que uno no creó un nuevo nombre para la operación que se lleva a cabo, por lo que no había nada nuevo asignado en el resultado. Cuando agregó sum=(Length+Length), de repente había un nombre disponible, (y la función sum era , no utilizada). En general, es una mala idea usar los nombres de las funciones para los nombres de las columnas.

En la segunda pregunta, creo que el argumento .fun debe ser una función plyr o algo que tenga sentido aplicado a un dataframe (dividido) como un todo, más que a cualquier función anterior. No hay función sum.data.frame. Pero 'nrow' o 'ncol' tienen sentido. Incluso puede obtener 'str' para trabajar en esa posición. La función de la longitud aplicado a una trama de datos da el número de columnas:

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

Me parece que cuando estoy teniendo problemas para "visualizar" la forma en cualquiera de las herramientas de trabajo funcionales en R, que la cosa más fácil de hacer es navegador un solo caso:

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

Entonces inspeccionar x en tiempo real y todo debe tener sentido. Luego puedes probar tu función en x, y si funciona, estás dorado (salvo que otras agrupaciones sean diferentes a tu primera x).