2017-01-14 1 views
3

Ich habe einen data.frame:Replizieren eines data.frame nach einem Vektor von lengths`

:

set.seed(1) 
short.df <- data.frame(id=letters[1:10],name=LETTERS[1:10]) 

Und ich jede Zeile durch eine Anzahl von Malen durch einen Vektor, dessen Länge gleich nrow(short.df) gegeben replizieren möchten

lengths <- c(sample(10000,10,replace=F)) 

Das dauert zu lang für meine wirkliche Datengröße:

long.df <- do.call(rbind,lapply(1:length(lengths),function(x) data.frame(id=rep(short.df$id,lengths[x]),name=rep(short.df$name[x],lengths[x])))) 

Jede Art und Weise t o es schneller machen?

Antwort

4

Sie können die Zeilen replizieren, indem Sie rep() in dem i-Argument von [.data.frame verwenden.

long.df <- short.df[rep(1:nrow(short.df), lengths), ] 

Check:

identical(nrow(long.df), sum(lengths)) 
# [1] TRUE 

Die neuen Zeilennamen nicht wünschenswert sein können, aber das ist einfach zu ändern.

Verwandte Themen