Jak rozwinąć ramkę danych w R.

15

Mam problem z analizą R.

Mam ramkę danych taką jak ta:

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

i musiałbym go „rozwinąć” (nie jestem pewien, czy właściwy termin), aby wyglądał tak:

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

itp.

Więc bierze wartość pary Osoba 1 i A (w tym przykładzie 3) i tworzy trzy rzędy z Osobą 1 i A i robi to dla każdej Osoby - Kombinacja Grupy. Nie mogę znaleźć dobrych słów do wyszukiwania online.

Juha-Matti S.
źródło
Wypróbuj reshape()funkcję
gość
Powinieneś zbadać reshape2pakiet w R. Może to również pomóc w dput2 przykładowych ramkach danych: jednym z danymi wejściowymi i drugim z danymi wyjściowymi.
Zach
Podałem odpowiedź, ale wydaje mi się, że jest to raczej pytanie dotyczące programowania w języku R niż pytanie statystyczne, więc może powinno zostać przeniesione gdzie indziej.
Gala
Dziękuję Gaëlowi za odpowiedź i pomoc w formatowaniu w moim pytaniu.
Juha-Matti S.

Odpowiedzi:

10

Chociaż jest to bardzo przydatny pakiet, myślę, że zmiana kształtu jest w tym przypadku nadmierna, rep może wykonać zadanie.

Oto kilka przykładowych danych:

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))

Teraz, aby go „rozwinąć”:

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

Nie mogłem znaleźć sposobu, aby pracować bezpośrednio nad ramką danych u góry głowy, więc pracuję nad każdą zmienną osobno, a następnie ponownie ją zestawiam, co jest trochę brzydkie, ale powinno być OK, o ile zawsze zajmiesz się używaniem ta sama zmienna dla zliczeń.

Gala
źródło
7
Co powiesz na to df[rep(seq_len(nrow(df)), df$count), 1:2]:?
chl
@chl, pan jest genialny!
Chris,
15

Możesz użyć funkcji unable z pakietu przekształcania.

Biorąc pod uwagę powyższe df (autor: 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
Etienne Low-Décarie
źródło
untablerobi dokładnie to, o czym wspomniałem w komentarzu :-) Dzięki za przypomnienie mi o tej funkcji!
chl
1

I uncountod tidyrteraz daje taki sam wynik jak powyżej.

library(tidyr)
df %>% uncount(Count)
Joe
źródło