Como expandir o quadro de dados em R

15

Estou tendo o seguinte problema ao fazer algumas análises com R.

Eu tenho um quadro de dados como este:

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

e eu precisaria "expandi-lo" (não tenho certeza se o termo certo) para ficar assim:

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

etc.

Portanto, ele pega o valor do par Pessoa 1 e A (neste exemplo, 3) e faz três linhas com a Pessoa 1 e A e o faz para todas as combinações Pessoa - Grupo. Não consigo encontrar boas palavras para pesquisar online.

Juha-Matti S.
fonte
Tente a reshape()função
guest
Você deve explorar o reshape2pacote em R. Também pode ajudar dput2 exemplos de quadros de dados: um com a entrada e outro com a saída.
Zach
Eu forneci uma resposta, mas acho que isso é mais uma questão de programação R do que uma questão estatística, então talvez deva ser migrada para outro lugar.
Gala
Obrigado Gaël pela resposta e ajuda na formatação da minha pergunta.
Juha-Matti S.

Respostas:

10

Embora seja um pacote muito útil, acho que a reformulação é um exagero nesse caso, o representante pode fazer o trabalho.

Aqui estão alguns dados de exemplo:

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

Agora, para "expandi-lo":

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

Não consegui encontrar uma maneira de trabalhar diretamente no quadro de dados em cima da minha cabeça, por isso estou trabalhando em cada variável separadamente e depois remontando-as, o que é um pouco feio, mas deve ficar bem desde que você cuide sempre de usar a mesma variável para as contagens.

Gala
fonte
7
Que tal isso df[rep(seq_len(nrow(df)), df$count), 1:2]:?
chl 23/03
@ chl, você é brilhante!
Chris
15

Você pode usar a função untable do pacote remodelar.

Dado o df acima (por @ 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
fonte
untablefaz exatamente o que eu mencionei no meu comentário :-) Obrigado por me lembrar dessa função!
chl 24/03
1

E a uncountpartir de tidyragora dá o mesmo resultado que acima.

library(tidyr)
df %>% uncount(Count)
Joe
fonte