So erweitern Sie den Datenrahmen in R

15

Ich habe folgendes Problem, während ich eine Analyse mit R durchführe.

Ich habe einen Datenrahmen wie diesen:

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

und ich müsste es "erweitern" (nicht sicher, ob der richtige Begriff), um so zu sein:

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

etc.

Es nimmt also den Wert des Paares Person 1 und A (in diesem Beispiel 3) an und erstellt drei Zeilen mit Person 1 und A, und zwar für jede Person-Gruppen-Kombination. Ich kann keine guten Wörter für die Online-Suche finden.

Juha-Matti S.
quelle
Probieren Sie die reshape()Funktion
Gast
Sie sollten das reshape2Paket in R untersuchen. Es kann auch hilfreich sein, dputzwei Beispieldatenrahmen zu verwenden: einen mit der Eingabe und einen mit der Ausgabe.
Zach
Ich habe eine Antwort gegeben, aber ich denke, dies ist eher eine R-Programmierfrage als eine statistische Frage. Vielleicht sollte sie also woanders migriert werden.
Gala
Danke Gaël für die Antwort und Hilfe bei der Formatierung in meiner Frage.
Juha-Matti S.

Antworten:

10

Während es ein sehr nützliches Paket ist, denke ich reshape Overkill in diesem Fall ist, rep kann die Arbeit erledigen.

Hier sind einige Beispieldaten:

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

Nun, um es zu "erweitern":

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

Ich konnte keine Möglichkeit finden, direkt am Datenrahmen zu arbeiten, also arbeite ich an jeder Variablen einzeln und setze sie dann wieder zusammen. Das ist ein bisschen hässlich, sollte aber in Ordnung sein, solange Sie darauf achten, immer zu verwenden die gleiche Variable für die Anzahl.

Gala
quelle
7
Wie wäre es damit df[rep(seq_len(nrow(df)), df$count), 1:2]:?
Chl
@chl, Sie Sir sind brillant!
Chris
15

Sie können die Untable-Funktion aus dem Umformungspaket verwenden.

Angesichts der oben genannten df (von @ 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
quelle
untablemacht genau das, was ich in meinem Kommentar erwähnt habe :-) Danke, dass du mich an diese Funktion erinnert hast!
Chl
1

Und uncountvon tidyrnun an ergibt sich das gleiche Ergebnis wie oben.

library(tidyr)
df %>% uncount(Count)
Joe
quelle