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.

Juha-Matti S.
la source
Essayez la reshape()fonction
invité
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.

Gala
la source
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
Etienne Low-Décarie
la source
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)
Joe
la source