Es gibt eine Reihe von Fragen über das Wiederholen von Zeilen mit einer vorgegebenen Anzahl von Malen in R, aber ich kann keine finden, um die spezifische Frage I anzusprechen frag ich.Wiederholte Blöcke von Zeilen in einem Datenrahmen basierend auf einem anderen Wert im Datenrahmen
Ich habe einen Datenrahmen von Antworten aus einer Umfrage, in der jeder Befragte irgendwo zwischen 5 und 10 Fragen beantwortet. Als Spielzeug Beispiel:
df <- data.frame(ID = rep(1:2, each = 5),
Response = sample(LETTERS[1:4], 10, replace = TRUE),
Weight = rep(c(2,3), each = 5))
> df
ID Response Weight
1 1 D 2
2 1 C 2
3 1 D 2
4 1 D 2
5 1 B 2
6 2 D 3
7 2 C 3
8 2 B 3
9 2 D 3
10 2 B 3
würde Ich mag Antworten Befragte 1 der zweimal wiederholen, als Block und dann Antworten des Befragten 2 3 mal, als Block, und ich möchte jeden Block von Antworten auf habe eine eindeutige ID. Mit anderen Worten, ich möchte das Endergebnis wie folgt aussehen:
ID Response Weight
1 11 D 2
2 11 C 2
3 11 D 2
4 11 D 2
5 11 B 2
6 12 D 2
7 12 C 2
8 12 D 2
9 12 D 2
10 12 B 2
11 21 D 3
12 21 C 3
13 21 B 3
14 21 D 3
15 21 B 3
16 22 D 3
17 22 C 3
18 22 B 3
19 22 D 3
20 22 B 3
21 23 D 3
22 23 C 3
23 23 B 3
24 23 D 3
25 23 B 3
So wie ich das tue ist derzeit wirklich klobig, und gegeben, dass ich> 3000 Befragten in meinem Datensatz ist unerträglich langsam.
Hier ist mein Code:
df.expanded <- NULL
for(i in unique(df$ID)) {
x <- df[df$ID == i,]
y <- x[rep(seq_len(nrow(x)), x$Weight),1:3]
y$order <- rep(1:max(x$Weight), nrow(x))
y <- y[with(y, order(order)),]
y$IDNew <- rep(max(y$ID)*100 + 1:max(x$Weight), each = nrow(x))
df.expanded <- rbind(df.expanded, y)
}
Gibt es einen schnelleren Weg, dies zu tun?
Darf ich fragen, warum Sie so eine Aufgabe ausführen möchten? – DJJ
Sicher. Ich arbeite an einer bedingten Logit-Analyse der Antworten der latenten Klasse (die im realen Datensatz 1/0 sind, keine Buchstaben wie oben). In Stata, wo ich gerade die Analyse mache, akzeptiert "lclogit" keine Gewichte, also unterstütze ich die inversen Wahrscheinlichkeitsgewichte, die ich habe. – TheChainsOfMarkov
Wiederhole 'ID 1' zweimal: 'df [df $ ID == 1,] [rep (seq_len (nwer (df [df $ ID == 1,]))), 2),]' –