df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
freq = 1:3)
Quelle est la manière la plus simple de développer chaque ligne les deux premières colonnes du data.frame ci-dessus, de sorte que chaque ligne soit répétée le nombre de fois spécifié dans la colonne 'freq'?
En d'autres termes, partez de ceci:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
Pour ça:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
data.frame
plus efficace est de remplacerrow.names(df)
parseq.int(1,nrow(df))
ouseq_len(nrow(df))
.ancienne question, nouveau verbe dans tidyverse:
la source
Utilisation à
expandRows()
partir dusplitstackshape
package:La syntaxe simple, très rapide, fonctionne sur
data.frame
oudata.table
.Résultat:
la source
La solution de @ neilfws fonctionne très bien pour
data.frame
s, mais pas pourdata.table
s car ils n'ont pas larow.names
propriété. Cette approche fonctionne pour les deux:Le code pour
data.table
est un peu plus propre:la source
df[rep(seq(.N), freq)][, freq := NULL]
df[rep(1:.N, freq)][, freq:=NULL]
Si vous devez effectuer cette opération sur des data.frames très volumineux, je vous recommande de le convertir en data.table et d'utiliser ce qui suit, qui devrait fonctionner beaucoup plus rapidement:
Découvrez à quel point cette solution est plus rapide:
la source
Error in rep(1, freq) : invalid 'times' argument
. Et étant donné qu'il existe déjà une réponse data.table à cette question, vous voudrez peut-être décrire en quoi votre approche est différente ou quand elle est meilleure que la réponse data.table actuelle. Ou s'il n'y a pas de différence majeure, vous pouvez l'ajouter en tant que commentaire à la réponse existante à la place.df
de la question du PO? Ma réponse est meilleure parce que l'autre réponse est en quelque sorte une mauvaise utilisation dudata.table
package en utilisant ladata.frame
syntaxe, voir la FAQ dedata.table
: "C'est généralement une mauvaise pratique de faire référence aux colonnes par numéro plutôt que par nom."df
publié par l'OP, mais lorsque j'ai essayé de le comparer sur un data.frame plus grand, j'ai eu cette erreur. Le data.frame que j'ai utilisé était le suivant: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 data.frame, la réponse de base fonctionne bien dans mon analyse comparative, elle ne s'adapte tout simplement pas à de plus grandes data.frames. Les trois autres réponses se sont déroulées avec succès avec ce data.frame plus grand.data.table
syntaxe, donc je ne devrais pas être celui qui juge les réponses.Une autre
dplyr
alternative avecslice
laquelle nous répétons chaque numéro de lignefreq
foisseq_len(n())
La pièce peut être remplacée par l'un des éléments suivants.la source
Une autre possibilité consiste à utiliser
tidyr::expand
:Version une ligne de la réponse de vonjd :
Créé le 21/05/2019 par le package reprex (v0.2.1)
la source
Je sais que ce n'est pas le cas, mais si vous devez conserver la colonne de fréquence d'origine, vous pouvez utiliser une autre
tidyverse
approche avecrep
:Créé le 21/12/2019 par le package reprex (v0.3.0)
la source
.remove = FALSE
dansuncount()