2017-01-14 1 views
3

J'ai data.frame:un Reproduire data.frame selon un vecteur de lengths`

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

Et je veux répliquer chaque ligne par un certain nombre de fois donnés par un vecteur dont la longueur est égale nrow(short.df):

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

Cela prend trop de temps pour ma taille réelle des données:

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

de toute façon t o le faire plus vite?

Répondre

4

Vous pouvez répliquer les lignes en utilisant rep() dans l'argument i de [.data.frame.

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

Vérifier:

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

Les nouveaux noms de ligne peuvent ne pas être souhaitable, mais ceux qui sont faciles à changer.