Répétez chaque ligne de données.cadre le nombre de fois spécifié dans une colonne
df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
freq = 1:3)
Quelle est la façon la plus simple de développer chaque ligne les deux premières colonnes de données.image ci-dessus, de sorte que chaque ligne est répétée le nombre de fois spécifié dans la colonne "fréquence"?
En d'autres termes, passer de ça:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
À ceci:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
Vous devez vous connecter pour publier un commentaire.
Voici une solution:
Résultat:
data.frame
plus efficace est de remplacerrow.names(df)
avecseq.int(1,nrow(df))
ouseq_len(nrow(df))
.vieille question, nouveau verbe dans tidyverse:
Utilisation
expandRows()
de lasplitstackshape
package:Syntaxe Simple, très rapide, fonctionne sur
data.frame
oudata.table
.Résultat:
@neilfws la solution fonctionne très bien pour
data.frame
s, mais pas pourdata.table
s puisqu'ils n'ont pas lerow.names
de la propriété. Cette approche fonctionne pour les deux:Le code pour
data.table
est un peu plus propre:df[rep(seq(.N), freq)][, freq := NULL]
df[rep(1:.N, freq)][, freq:=NULL]
Dans le cas où vous avez à faire cette opération sur de très gros volumes de données.images je recommanderais de le convertir en données.table et utiliser la suite, qui devrait courir beaucoup plus vite:
Voir comment beaucoup plus rapide de cette solution est:
Error in rep(1, freq) : invalid 'times' argument
. Et étant donné qu'il existe déjà un ensemble de données.table de réponse à cette question, vous pouvez décrire comment votre approche est différente ou quand il est préférable que les données actuelles.table de réponse. Ou si il n'y a pas une grande différence, vous pouvez ajouter un commentaire à la réponse existant au lieu.df
de l'OP question? Ma réponse est mieux parce que l'autre réponse est le genre d'utilisation abusive de ladata.table
package à l'aide dedata.frame
la syntaxe, voir la FAQ dedata.table
: "Il est généralement une mauvaise pratique de faire référence aux colonnes par le nombre, plutôt que de nom."df
posté par l'OP, mais quand j'ai essayé de comparer cela à un plus grand nombre de données.cadre que j'ai eu cette erreur. Les données.image que j'ai utilisé était: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))
Sur le minuscule données.le cadre, la réponse de la base n'bien dans mon comparative, il n'a tout simplement pas de l'échelle pour plus de données.les cadres. Les trois autres réponses a couru avec succès avec ce plus grand nombre de données.cadre.data.table
syntaxe, donc je ne devrais pas être le seul à en juger les réponses.Un autre
dplyr
alternative avecslice
où nous répétons chaque numéro de lignefreq
foisseq_len(n())
partie peut être remplacée par une des méthodes suivantes.Une autre possibilité est d'utiliser
tidyr::expand
:One-liner version de vonjd réponse:
Créé sur 2019-05-21 par le reprex paquet (v0.2.1)