2015-10-10 16 views
6

mio df assomiglia a questo:dcast ristrutturazione da lungo a grande formato che non funziona

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 

voglio ristrutturare da Id e ottenere:

Id A B … Z  
3 5 3  
4 4 6   

ho provato:

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

e ha ricevuto l'errore:

Aggregation function missing: defaulting to length 

Non riesco a capire cosa inserire nel fun.aggregate. Qual è il problema?

+0

In base all'esempio mostrato, non ricevo alcun avviso. Se si dispone di duplicati, potrebbe essere necessario creare una colonna di sequenza – akrun

+0

Se è necessario il 'sum' (basato sull'output previsto mostrato)' dcast (df, Id ~ Type, value.var = 'Freq', sum) ' – akrun

+0

Grazie Jaap! Non sono sicuro di comprendere appieno la tua spiegazione: le mie prime due colonne (Id e Attività) devono essere compresse da due righe a una. È questo il motivo per cui ho bisogno della funzione fun.aggregate? E se è così - perché "somma"? Non li sto riassumendo. – user3315563

risposta

7

Il motivo per cui si stanno ottenendo questo avvertimento è nella descrizione del fun.aggregate (vedi ?dcast):

aggregation function needed if variables do not identify a single observation for each output cell. Defaults to length (with a message) if needed but not specified

Quindi, una funzione di aggregazione è necessaria quando non v'è più di un valore per un posto nella vasta dataframe.

Una spiegazione sulla base di dati:

Quando si utilizza dcast(df, Id + Task ~ Type, value.var="Freq") si ottiene:

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

Il che è logico, perché per ogni combinazione di Id, Task e Type c'è solo valore in Freq. Ma quando si utilizza dcast(df, Id ~ Type, value.var="Freq") si ottiene questo (tra cui un messaggio di avviso):

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

Ora, guardando indietro la parte superiore dei suoi dati:

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

a capire perché questo è il caso. Per ogni combinazione di Id e Type ci sono due valori in Freq (per Id 3: 2 e 3 per A & 3 e 0 per tipo B) mentre si può solo mettere un valore in questo luogo nel vasto dataframe per ogni valore di type . Pertanto, dcast desidera aggregare questi valori in un unico valore. La funzione di aggregazione predefinita è length, ma è possibile utilizzare altre funzioni di aggregazione come sum, mean, sd o una funzione personalizzata specificandole con fun.aggregate.

Ad esempio, con fun.aggregate = sum si ottiene:

Id A B 
1 3 5 3 
2 4 4 6 

Ora non v'è alcun avviso perché dcast che viene detto cosa fare quando c'è più di un valore: restituire la somma dei valori.

Problemi correlati