Dificuldade para colocar o banco de dados no formato longo

Ei gente… boa tarde… estou trabalhando em um banco de dados que tem nas colunas os dias que os dados de peso foram coletados. A coleta ocorreu em períodos diferentes, em um grupo coletamos o peso 97 vezes e no outro grupo foram 51 vezes. Além dessas colunas, tenho duas colunas das variáveis independentes (dieta e exercício). Quero colocar o banco de dados no formato longo para fazer as análises, e estou usando a função reshape. Está dando um erro:

Error in reshapeLong(data, idvar = idvar, timevar = timevar, varying = varying, :
‘varying’ arguments must be the same length

Acho que o erro tem relação com a diferença entre os grupos no tempo de coleta, mas eu quero comparar os dois grupos, então, não sei como fazer… já que entendo que preciso colocar o banco de dados no formato longo. Agradeço se alguém puder me ajudar.

Abs

1 curtida

Oi @Ivana ,

Parece que o problema é esse mesmo. Só para entender um pouco melhor, você tem duas tabelas? Uma para cada grupo, ou já está tudo na mesma tabela, com (97 + 51) colunas?

O que estou imaginando é que você vai ter que transformar no formato longo p/ cada grupo e depois empilhar as duas tabelas.

Ei @dfalbel… Então… eu fiz na mesma tabela… de acordo com a sua resposta eu tenho que separar as tabelas e empilhá-las… é isso? Como eu faço o empilhamento?

1 curtida

Ivana, por favor, rode a funcao dput() colocando dentro dela o nome do seu conjunto de dados (dataframe). E cole aqui pra nós, assim ficará mais facil te ajudar =)

Ivana,

fiz uma pequena reprodução de como entendi o seu problema, mas numa versão reduzida: em um grupo a coleta ocorreu 7 vezes, no outro grupo foram 3 vezes. E ai basta voce rodar e confirmar se bate com o que voce descreveu. Depois disso apliquei a funcao dplyr::pivot_longer(). ABraço!

library(dplyr)

df <- data.frame(dieta = NA,
                 exercicio = NA,
                  col_grupo1_1 = c(1), 
                  col_grupo1_2 = c(2), 
                  col_grupo1_3 = c(3), 
                  col_grupo1_4 = c(4), 
                  col_grupo1_5 = c(5),
                  col_grupo1_6 = c(5),
                  col_grupo1_7= c(6),
                  col_grupo2_1 = c(1), 
                  col_grupo2_2 = c(2), 
                  col_grupo2_3 = c(3))


new_df <- pivot_longer(df,
             cols = starts_with("col_"), 
             names_to = "GrupoColeta",
             values_to = "Valor"
              )

Olá Claudiano… obrigada pela resposta… essa é uma parte do conjunto dos meus dados:

    ID EXERC  DIETA TEMPO GRUPOS    P1    P2    P3    P4    P5    P6    P7    P8

1 EXCNT I Exerc Padrao 6M EP6M 81.6 85.4 95.8 101.8 105.8 114.5 112.3 121.5
2 EXCNT II Exerc Padrao 6M EP6M 113.6 117.8 119.0 124.8 127.4 136.4 141.9 151.0
3 EXCNT III Exerc Padrao 6M EP6M 108.5 107.2 110.3 114.4 118.3 132.9 134.3 137.3
4 EXCNT IV Exerc Padrao 6M EP6M 119.3 119.6 122.7 130.2 136.9 149.7 159.0 148.5
5 EXCNT V Exerc Padrao 6M EP6M 133.6 134.3 136.6 142.8 140.0 150.6 151.2 158.5
6 EXCNT VI Exerc Padrao 6M EP6M 134.5 141.6 150.5 158.8 160.0 173.0 176.4 181.6

*** aí só tem os dados que foram coletados em 6 meses (coluna TEMPO, 6M), depois de 48 linhas começa o grupo de 3 meses = coluna TEMPO, 3M)

Para tentar girar o banco de dados eu fiz:

dadosl ← reshape(dados, direction=“long”,
idvar = “ID”,
varying = list(c(“P1”,“P2”,“P3”,“P4”, “P5”, “P6”, “P7”,
“P8”, “P9”, “P10”, … “P97”),
v.names = “Peso”,
timevar = “DIAS”))

Para usar o código que você sugeriu devo substituir o col_grupo_1_1 por P1 e assim sucessivamente, para os dois grupos?

Então… fiz aqui o que eu entendi da sua sugestão, substituindo o col_grupo por P1… não deu certo…

df ← data.frame (DIETA = NA, EXERC = NA, TEMPO = NA, GRUPOS = NA,
P1 = c(1), P2 = c(2), P3 = c(3), P4 = c(4), P5 = c(5), P6 = c(6),
P7= c(7), P1 = c(1), P2 = c(2), P3 = c(3))

df
DIETA EXERC TEMPO GRUPOS P1 P2 P3 P4 P5 P6 P7 P1.1 P2.1 P3.1
1 NA NA NA NA 1 2 3 4 5 6 7 1 2 3

1 curtida

Considerando esses dados que voce me enviou, fiz o codigo abaixo. Reproduzindo seus dados, e criando o codigo. Isso vai te orientar melhor (eu acho rs). abraço,

library(tidyverse)

recriando os dados que voce enviou

df <- data.frame(ID = c("EXCNT I", "EXCNT II", "EXCNT III", "EXCNT IV", "EXCNT V", "EXCNT VI"),
                 EXERC = c("Exerc", "Exerc", "Exerc", "Exerc", "Exerc", "Exerc"),
                 DIETA = c("Padrão", "Padrão","Padrão", "Padrão", "Padrão", "Padrão"),
                 TEMPO = c("6M", "6M", "6M", "6M", "6M", "6M"),
                 GRUPOS = c("EP6M","EP6M","EP6M","EP6M","EP6M","EP6M"),
                  P1 = c(1), 
                  P2 = c(2), 
                  P3 = c(3), 
                  P4 = c(4), 
                  P5 = c(5),
                  P6 = c(5),
                  P7= c(6),
                  P8 = c(1))

É a partir daqui que voce deve usar no seu script: aplicar a funçao pivot_loger() para gerar a mudança no dataframe

new_df <- pivot_longer(df,  # df deve ser substituido pelo nome do seu dataframe
             cols = starts_with("P"),  # dizendo pra maquina qual as colunas devem ser usadas
             names_to = "DiaColeta",  # como se chamará a coluna que receberá os P's
             values_to = "ValorColeta" # nomeando as colunas que receberá os valores dos P's
              )
1 curtida

O que de verdade interessa pra ti eh reproduzir a parte final do codigo, onde uso a funçao pivot_loger() do dplyr.

O P8 corresponde ao peso medido no dia 8 dos dois grupos… do de 6 meses e o de 3 meses. Eu tentei fazer P8 = c(1) e não deu certo… postei o output na mensagem anterior…
Para fazer essa atribuição ao df que vc fez na primeira parte do código, eu teria que copiar todas linhas dos dados das primeiras colunas?

Basta voce rodar esse codigo abaixo, mudando apenas o *df* pelo nome do seu dataframe


    pivot_longer(df,  # nome do banco de dados
                 cols = starts_with("P"), 
                 names_to = "DiaColeta",  
                 values_to = "ValorColeta")
1 curtida

Deu super certo!!! Ufa!!! Obrigada Claudiano…

1 curtida