Estou tendo problemas para reorganizar o seguinte quadro de dados:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Quero reformulá-lo para que cada variável "name" seja um nome de arquivo, com os "valores" como observações ao longo dessa linha e os "números" como nomes de colunas. Mais ou menos assim:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Eu olhei melt
e cast
algumas outras coisas, mas nenhuma parece fazer o trabalho.
Respostas:
Usando a
reshape
função:fonte
reshape
vem com elestats
. Sem mencionar que é mais rápido! =)reshape
é um exemplo excelente para uma API de função horrível. É muito perto de inútil.reshape
comentários e nomes de argumentos semelhantes não são tão úteis. No entanto, descobri que, por muito tempo, você deve fornecerdata =
seus dados.frame,idvar
= a variável que identifica seus grupos,v.names
= as variáveis que se tornarão várias colunas em formato amplo,timevar
= a variável que contém os valores que serão anexados parav.names
em formato amplo,,direction = wide
esep = "_"
. Claro o suficiente? ;)O novo
tidyr
pacote (em 2014) também faz isso de forma simples, comgather()
/spread()
sendo os termos paramelt
/cast
.Edit: Agora, em 2019, o tidyr v 1.0 foi iniciado e definido
spread
egather
em um caminho de descontinuação, preferindopivot_wider
epivot_longer
, que você pode encontrar descrito nesta resposta . Leia se você quiser uma breve visão da vida curta despread/gather
.No github ,
fonte
tidyr
ereshape2
. Ele fornece bons exemplos e explicações.Você pode fazer isso com a
reshape()
função ou com as funçõesmelt()
/cast()
no pacote de remodelação. Para a segunda opção, o código de exemplo éOu usando
reshape2
fonte
cast
oudcast
não funcionará bem se você não tiver uma coluna "valor" clara. Tentedat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)
e você não conseguirá o que espera. Você precisa observar explicitamente ovalue/value.var
-cast(dat, id ~ index, value="blah")
edcast(dat, id ~ index, value.var="blah")
por exemplo.Outra opção se o desempenho é uma preocupação é usar
data.table
a extensão dereshape2
funções de fusão e transmissão( Referência: Remodelagem eficiente usando data.tables )
E, a partir do data.table v1.9.6, podemos converter em várias colunas
fonte
data.table
abordagem é a melhor! muito eficiente ... você verá a diferença quandoname
houver uma combinação de 30 a 40 colunas !!Usando seu exemplo de quadro de dados, poderíamos:
fonte
Outras duas opções:
Pacote base:
sqldf
pacote:fonte
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)
Usando a
aggregate
função base R :fonte
Com a versão devel de
tidyr
‘0.8.3.9000’
, existepivot_wider
epivot_longer
é generalizado para a remodelagem (longa -> larga, larga -> longa, respectivamente) de 1 para várias colunas. Usando os dados do OPcoluna única longa -> larga
-> criou outra coluna para mostrar a funcionalidade
fonte
A
reshape
função base funciona perfeitamente bem:Onde
idvar
é a coluna de classes que separa linhastimevar
é a coluna de classes para difundirv.names
é a coluna que contém valores numéricosdirection
especifica o formato amplo ou longosep
argumento opcional é o separador usado entretimevar
os nomes das classes ev.names
na saídadata.frame
.Se não
idvar
existir, crie um antes de usar areshape()
função:Basta lembrar que
idvar
é necessário! Otimevar
ev.names
parte é fácil. A saída dessa função é mais previsível do que algumas outras, pois tudo é definido explicitamente.fonte
Há muito poderoso novo pacote de cientistas de dados Gênio no Win-vetorial (pessoas que fizeram
vtreat
,seplyr
ereplyr
) chamadocdata
. Ele implementa os princípios de "dados coordenados" descritos neste documento e também nesta postagem do blog . A idéia é que, independentemente de como você organiza seus dados, deve ser possível identificar pontos de dados individuais usando um sistema de "coordenadas de dados". Aqui está um trecho da recente postagem de blog de John Mount:Primeiro criaremos a tabela de controle (consulte publicação no blog para obter detalhes) e depois executaremos a movimentação de dados de linhas para colunas.
fonte
maneira muito mais fácil!
se você quiser voltar de largo para longo, altere apenas Largo para Longo e não há alterações nos objetos.
fonte