Come espandere il frame di dati in R


15

Sto riscontrando il seguente problema durante l'analisi con R.

Ho un dataframe come questo:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

e avrei bisogno di "espanderlo" (non sono sicuro se il termine giusto) sia così:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

eccetera.

Quindi prende il valore della coppia Person 1 e A (in questo esempio, 3) e crea tre righe con Person 1 e A e lo fa per ogni persona - Combinazione di gruppo. Non riesco a capire nessuna buona parola per la ricerca online.



Dovresti esplorare il reshape2pacchetto in R. Potrebbe anche aiutare a dput2 esempi di frame di dati: uno con l'input e uno con l'output.
Zach,

Ho fornito una risposta, ma suppongo che sia più una domanda di programmazione R che una domanda statistica, quindi forse dovrebbe essere migrata altrove.
Gala,

Grazie Gaël per la risposta e l'aiuto nella formattazione della mia domanda.
Juha-Matti S.

Risposte:


10

Sebbene sia un pacchetto molto utile, penso che la rimodulazione sia eccessiva in questo caso, il rappresentante può fare il lavoro.

Ecco alcuni dati di esempio:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Ora, per "espanderlo":

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

Non sono riuscito a trovare un modo per lavorare direttamente sul frame di dati dalla parte superiore della mia testa, quindi sto lavorando su ciascuna variabile separatamente e quindi riassemblandole, il che è un po 'brutto ma dovrebbe essere OK finché ti occupi sempre di usare la stessa variabile per i conteggi.


7
Che ne dici di questo df[rep(seq_len(nrow(df)), df$count), 1:2]:?
chl

@chl, signore siete fantastici!
Chris,

15

È possibile utilizzare la funzione untable dal pacchetto reshape.

Dato il precedente df (di @ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untablefa esattamente quello che ho menzionato nel mio commento :-) Grazie per avermi ricordato di quella funzione!
chl

1

E uncountda tidyradesso dà lo stesso risultato di cui sopra.

library(tidyr)
df %>% uncount(Count)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.