Comment développer un bloc de données dans R


15

Je rencontre un problème lors de l'analyse avec R.

J'ai une trame de données comme celle-ci:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

et je devrais le "développer" (je ne sais pas si le bon terme) pour être comme ceci:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

etc.

Il prend donc la valeur de la paire Personne 1 et A (dans cet exemple, 3) et crée trois lignes avec la personne 1 et A et le fait pour chaque personne - Combinaison de groupe. Impossible de trouver de bons mots pour effectuer une recherche en ligne.



Vous devriez explorer le reshape2package dans R. Cela pourrait également aider à dput2 exemples de cadres de données: un avec l'entrée et un avec la sortie.
Zach

J'ai fourni une réponse, mais je suppose qu'il s'agit plus d'une question de programmation R que d'une question statistique, alors peut-être qu'elle devrait être migrée ailleurs.
Gala

Merci Gaël pour la réponse et l'aide au formatage de ma question.
Juha-Matti S.

Réponses:


10

Bien qu'il s'agisse d'un package très utile, je pense que le remodelage est excessif dans ce cas, le représentant peut faire le travail.

Voici quelques exemples de données:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Maintenant, pour «l'étendre»:

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

Je ne pouvais pas trouver un moyen de travailler directement sur la trame de données du haut de ma tête, donc je travaille sur chaque variable séparément, puis je les rassemble, ce qui est un peu moche mais devrait être OK tant que vous prenez soin de toujours utiliser la même variable pour les comptes.


7
Et à ce sujet df[rep(seq_len(nrow(df)), df$count), 1:2]:?
chl

@chl, vous êtes monsieur brillant!
Chris

15

Vous pouvez utiliser la fonction untable du package de remodelage.

Compte tenu du df ci-dessus (par @ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untablefait exactement ce que j'ai mentionné dans mon commentaire :-) Merci de me rappeler cette fonction!
chl

1

Et uncountde tidyrdonne maintenant le même résultat que ci - dessus.

library(tidyr)
df %>% uncount(Count)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.