r data.table reshape reshape2

error de dcast: ''Falta la función de agregación: el valor predeterminado es la longitud''



data.table reshape (1)

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 A B … Z 3 5 3 4 4 6

Lo intenté:

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

y obtuve el error:

Falta la función de agregación: el valor predeterminado es la longitud

No puedo entender 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 sola observación para cada celda de salida. El valor predeterminado es la longitud (con un mensaje) si es necesario pero no se especifica

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

Una explicación basada en sus datos:

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

Id Task A B 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 un valor en Freq . Pero cuando usa dcast(df, Id ~ Type, value.var="Freq") obtiene esto (incluido un mensaje de advertencia):

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

Ahora, mirando hacia atrás en 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 lugar en el marco de datos 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 A B 1 3 5 3 2 4 4 6

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