Error de dcast: ‘Falta la función de agregación: valor predeterminado para la longitud’

Mi df ve así:

 Id Task Type Freq 3 1 A 2 3 1 B 3 3 2 A 3 3 2 B 0 4 1 A 3 4 1 B 3 4 2 A 1 4 2 B 3 

Quiero reestructurar por Id y obtener:

 Id AB … Z 3 5 3 4 4 6 

Lo intenté:

 df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq") 

y obtuve el error:

Función de agregación faltante: valor predeterminado a la longitud

No puedo imaginarme qué poner en la fun.aggregate . fun.aggregate . ¿Cuál es el problema?

La razón por la que recibe esta advertencia está en la descripción de fun.aggregate (vea ?dcast ):

función de agregación necesaria si las variables no identifican una única observación para cada celda de salida. El valor predeterminado es la longitud (con un mensaje) si es necesario pero no especificado

Por lo tanto, se necesita una función de agregación cuando hay más de un valor para un punto en el dataframe amplio.

Una explicación basada en sus datos:

Cuando usa dcast(df, Id + Task ~ Type, value.var="Freq") obtiene:

  Id Task AB 1 3 1 2 3 2 3 2 3 0 3 4 1 3 3 4 4 2 1 3 

Lo cual es lógico porque para cada combinación de Id , Task y Type solo hay valor en Freq . Pero cuando usas dcast(df, Id ~ Type, value.var="Freq") obtienes esto (incluido un mensaje de advertencia):

 Aggregation function missing: defaulting to length Id AB 1 3 2 2 2 4 2 2 

Ahora, mirando hacia atrás a la parte superior de sus datos:

 Id Task Type Freq 3 1 A 2 3 1 B 3 3 2 A 3 3 2 B 0 

Ya ves por qué este es el caso. Para cada combinación de Id y Type hay dos valores en Freq (para Id 3: 2 y 3 para A y 3 y 0 para Tipo B ) mientras que solo puede poner un valor en este punto en el dataframe amplio para cada valor de type . Por dcast tanto dcast quiere agregar estos valores en un solo valor. La función de agregación predeterminada es la length , pero puede usar otras funciones de agregación como sum , mean , sd o una función personalizada al especificarlas con fun.aggregate .

Por ejemplo, con fun.aggregate = sum obtienes:

  Id AB 1 3 5 3 2 4 4 6 

Ahora no hay advertencia porque se le dice a dcast qué hacer cuando hay más de un valor: devuelve la sum de los valores.