df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
freq = 1:3)
Was ist der einfachste Weg, um jede Zeile um die ersten beiden Spalten des obigen Datenrahmens zu erweitern, sodass jede Zeile so oft wiederholt wird, wie in der Spalte 'freq' angegeben?
Mit anderen Worten, gehen Sie davon aus:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
Dazu:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
data.frame
effizienter ist , zu ersetzen ,row.names(df)
mitseq.int(1,nrow(df))
oderseq_len(nrow(df))
.alte Frage, neues Verb in tidyverse:
quelle
Verwendung
expandRows()
aus dersplitstackshape
Packung:Einfache Syntax, sehr schnell, funktioniert auf
data.frame
oderdata.table
.Ergebnis:
quelle
Die Lösung von @ neilfws funktioniert hervorragend für
data.frame
s, aber nicht fürdata.table
s, da ihnen dierow.names
Eigenschaft fehlt . Dieser Ansatz funktioniert für beide:Der Code für
data.table
ist ein bisschen sauberer:quelle
df[rep(seq(.N), freq)][, freq := NULL]
df[rep(1:.N, freq)][, freq:=NULL]
Falls Sie diesen Vorgang für sehr große data.frames ausführen müssen, würde ich empfehlen, ihn in eine data.table zu konvertieren und Folgendes zu verwenden, das viel schneller ausgeführt werden sollte:
Sehen Sie, wie viel schneller diese Lösung ist:
quelle
Error in rep(1, freq) : invalid 'times' argument
. Und da es bereits eine Antwort auf diese Frage gibt, möchten Sie möglicherweise beschreiben, wie sich Ihr Ansatz unterscheidet oder wann er besser ist als die aktuelle Antwort auf die Datentabelle. Wenn es keinen großen Unterschied gibt, können Sie ihn stattdessen als Kommentar zur vorhandenen Antwort hinzufügen.df
aus der Frage des OP? Meine Antwort ist besser, weil die andere Antwort darin besteht, dasdata.table
Paket mithilfe derdata.frame
Syntax zu missbrauchen. Weitere Informationen finden Sie in den häufig gestellten Fragendata.table
: "Es ist im Allgemeinen eine schlechte Praxis, Spalten eher nach Nummer als nach Name zu referenzieren."df
vom OP veröffentlichten Beispiel, aber als ich versuchte, dies mit einem größeren Datenrahmen zu vergleichen, wurde dieser Fehler angezeigt. Der von mir verwendete data.frame war:set.seed(1) dfbig <- data.frame(var1=sample(letters, 1000, replace = TRUE), var2=sample(LETTERS, 1000, replace = TRUE), freq=sample(1:10, 1000, replace = TRUE))
Auf dem winzigen data.frame funktioniert die Basisantwort in meinem Benchmarking gut, sie lässt sich einfach nicht gut auf größere data.frames skalieren. Die anderen drei Antworten wurden mit diesem größeren Datenrahmen erfolgreich ausgeführt.data.table
Syntax nicht, daher sollte ich nicht derjenige sein, der die Antworten beurteilt.Eine weitere
dplyr
Alternative, bei derslice
wir jede Zeilefreq
mehrmals wiederholenseq_len(n())
Teil kann durch eines der folgenden ersetzt werden.quelle
Eine andere Möglichkeit ist die Verwendung von
tidyr::expand
:Einzeilige Version von vonjds Antwort :
Erstellt am 21.05.2019 durch das reprex-Paket (v0.2.1)
quelle
Ich weiß, dass dies nicht der Fall ist, aber wenn Sie die ursprüngliche Freq-Spalte beibehalten müssen, können Sie einen anderen
tidyverse
Ansatz verwenden, zusammen mitrep
:Erstellt am 21.12.2019 vom reprex-Paket (v0.3.0)
quelle
.remove = FALSE
inuncount()