2013-10-13 19 views
9

Non sono nemmeno sicuro di come intitolare correttamente la domanda!R riorganizzare il dataframe: alcune righe alle colonne

Supponiamo che io sono un dataframe d:

dataframe attuale:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10)) 

    sample cat count 
1  A k  1 
2  B l  2 
3  A m  3 
4  B n  4 
5  A o  5 
6  B p  6 
7  A q  7 
8  B r  8 
9  A s  9 
10  B t 10 

e sto cercando di ri-organizzare le cose in modo tale che ogni valore gatto diventa una colonna della propria, campione rimane una colonna (o diventa il nome della riga) e il conteggio sarà i valori nelle nuove colonne cat, con 0 dove un campione non ha un conteggio per un gatto. In questo modo:

desiderata di layout dataframe:

sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

Qual è il modo migliore per andare su questo?

Questo è quanto ho ottenuto:

for (i in unique(d$sample)) { 
    s <- d[d$sample==i,] 
    st <- as.data.frame(t(s[,3])) 
    colnames(st) <- s$cat 
    rownames(st) <- i 
} 

cioè scorrendo i campioni nel dataframe originale, e recepisce per ogni sottoinsieme campione. Quindi in questo caso ho

k m o q s 
A 1 3 5 7 9 

e

l n p r t 
B 2 4 6 8 10 

e questo è dove mi si blocca. Ho provato un sacco di cose con unire(), bind(), apply(), ... ma non riesco a trovare la cosa giusta. Inoltre, non posso fare a meno di chiedermi se quel ciclo sopra è un passo necessario - qualcosa con lo stack() forse?

Inutile dire che sono nuovo di R ... Se qualcuno mi può aiutare, sarebbe molto apprezzato!

PS Motivo per cui sto cercando di riorganizzare il mio dataframe è nella speranza di rendere più semplice la rappresentazione dei valori (cioè voglio mostrare l'effettivo df in un grafico in formato tabella).

Grazie!

+0

L'operazione che si desidera eseguire è passata da "long" a "wide". Questa domanda è stata fatta e ha risposto molte volte prima. – nograpes

+1

Le mie scuse. Ho cercato senza sosta tra qui e google, non riuscivo a trovare niente di simile a quello di cui avevo bisogno (non sapendo esattamente come chiamare ciò di cui ho bisogno non è d'aiuto). Cercherò "long"/"wide" ... – crs

risposta

9

Utilizzo di reshape dalla base R:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide") 
names(nn)[-1]<-as.character(d$cat) 
nn[is.na(nn)]<-0 
> nn 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 
+0

Grazie, @Metrics - anche questo funziona! (e ora capisco a che cosa si riferiva nograpes con "lungo" e "largo" nel suo commento!). La soluzione di Jilber sembra più concisa - qual è la differenza altrimenti? Grazie per il tuo aiuto! Sempre buono per imparare sth in più. – crs

+1

@crs, la grande differenza è che sia 'xtabs' che' dcast' possono avere solo una variabile "valore" per convertirsi in un grande formato. Ad esempio, prova la prima riga del codice di Metrics dopo aver apportato una piccola modifica alla "d" originale "data.frame':' d $ blah <- 11: 20'. Ora prova a fare lo stesso con 'dcast' o' xtabs'. Con 'dcast', un risultato simile sarebbe possibile dopo aver prima fuso i dati. Con 'xtabs' dovresti rimodellare le variabili separatamente e' cbind'le insieme. E 'reshape()' è piuttosto veloce, specialmente in confronto all'attuale implementazione di 'dcast'. – A5C1D2H2I1M1N2O1R2T1

+1

Metriche: +1, ma ancora una volta, non so se mi prenderei la briga di rinominare. In questo caso, a causa dell'esempio esteso che descrivo nel commento sopra ... – A5C1D2H2I1M1N2O1R2T1

12

Usa dcast dal pacchetto reshape2

> dcast(d, sample~cat, fill=0) 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

xtabs dalla base è un'altra alternativa

> xtabs(count~sample+cat, d) 
     cat 
sample k l m n o p q r s t 
    A 1 0 3 0 5 0 7 0 9 0 
    B 0 2 0 4 0 6 0 8 0 10 

Se si preferisce l'uscita per essere un data.frame, quindi provare:

> as.data.frame.matrix(xtabs(count~sample+cat, d)) 
    k l m n o p q r s t 
A 1 0 3 0 5 0 7 0 9 0 
B 0 2 0 4 0 6 0 8 0 10 
+0

Lui, questo sembra pulito. Tuttavia, avrei dovuto menzionare, sto cercando un modo per farlo in standard (base) R ... (come questo non è per me).Come posso farlo? (anche se è più coinvolto?) – crs

+1

@crs vedi la mia modifica, ho aggiunto una soluzione di base R. –

+1

Oh, sanguinante, grazie mille !!!! Questo è esattamente! Non posso ancora votare, ma benedico il tuo cuore :) – crs

Problemi correlati