2016-04-25 8 views
3

Ich habe einen Datenrahmen mit einer Anzahl von ID- und Max-Werten.Backfill-Datenrahmen in R basierend auf der maximalen Anzahl

df <- data.frame(id = c("a", "b", "c"), max.number = c(0, 6, 4)) 

    id max.number 
1 a   0 
2 b   6 
3 c   4 

Ich möchte einen neuen Datenrahmen erstellen, der für jede ID auf Null zurückfließt. Es würde wie folgt aussehen:

id  number 
1 a   0 
2 b   0 
3 b   1 
4 b   2 
5 b   3 
6 b   4 
7 b   5 
8 b   6 
9 b   0 
10 c   1 
11 c   2 
12 c   3 
13 c   4 

Ich habe versucht, für Schleife dies durch einen verschachtelten zu tun, aber kann sie nicht richtig zu arbeiten. Ich würde gerne ein wenig Anleitung dabei haben, wenn möglich.

+1

Sie mit 'id gehen könnte <- lapply (df $ max.number, seq, aus = 0); data.frame (id = rep (df $ id, länge (id)), num = unlist (id)) ' – user20650

+0

Sie finden nützliche'? Rep' für "id" und '? Sequenz' für" max. Nummer " –

+0

@ user20650 Das hat perfekt funktioniert. Vielen Dank! Sicherstellen, dass ich den Prozess verstehe. Mit Hilfe von lapply wird eine Liste mit Vektoren von 0 bis zu meiner maximalen Anzahl erstellt. Dann wird ein Datenrahmen erzeugt, indem die ID für die Länge jedes Vektors mit der ID-Liste wiederholt wird und die ID-Liste entfernt wird. Vielen Dank! – ak24

Antwort

1

mit einem data.table Tisch Dies wäre sehr einfach:

# install.packages("data.table") 
library(data.table) 

df <- data.frame(id = c("a", "b", "c"), max.number = c(0, 6, 4)) 
dt <- as.data.table(df) 
# or directly: 
# dt <- data.table(id = c("a", "b", "c"), max.number = c(0, 6, 4)) 
dt[, .(number=seq(0, max.number)), by=id] 

Ausgang:

id number 
1: a  0 
2: b  0 
3: b  1 
4: b  2 
5: b  3 
6: b  4 
7: b  5 
8: b  6 
9: c  0 
10: c  1 
11: c  2 
12: c  3 
13: c  4 
Verwandte Themen