TransWikia.com

Como distribuir o conteúdo de uma coluna por outras colunas no R?

Stack Overflow em Português Asked by itamar on November 3, 2020

Estou tentando distribuir o conteúdo de uma coluna em outras 3 colunas.

Tenho o seguinte Data Frame:

library(tidyr)

df<-data.frame(Coluna=
c('2237-5953',
'(RE) PENSANDO DIREITO',
'B4',
'2469-4312',
'[IN] TRANSITION',
'B2',
'1981-030X',
'19&20 (RIO DE JANEIRO)',
'B1',
'2053-1583',
'2D MATERIALS',
"A2")
  )

df
                   Coluna
1               2237-5953
2   (RE) PENSANDO DIREITO
3                      B4
4               2469-4312
5         [IN] TRANSITION
6                      B2
7               1981-030X
8  19&20 (RIO DE JANEIRO)
9                      B1
10              2053-1583
11           2D MATERIALS
12                     A2

Há um padrão aqui que é o número do ISSN do periódico, o título do mesmo e a classificação dele no Qualis. Portanto, a cada três linhas, as informações se repetem.

Pensei em criar um novo data frame df2 com as colunas correspondentes:

df2<-data.frame(df, numero="", periodico="", qualis="")

> df2
                   Coluna numero periodico qualis
1               2237-5953                        
2   (RE) PENSANDO DIREITO                        
3                      B4                        
4               2469-4312                        
5         [IN] TRANSITION                        
6                      B2                        
7               1981-030X                        
8  19&20 (RIO DE JANEIRO)                        
9                      B1                        
10              2053-1583                        
11           2D MATERIALS                        
12                     A2                        
> 

Feito isso, pensei em usar a função spread( ) para espalhar o conteúdo da primeira coluna (chamada "Coluna") entre estas 3 colunas recém-criadas:

df2 %>% 
  spread(Coluna, c(numero:qualis))

Mas, sem sucesso.

Imaginei que tinha transmitido o seguinte comando "espalhe o conteúdo da coluna "Coluna" nas colunas que vão de "numero" a "qualis"."

No entanto, evidentemente, não foi isso que o R entendeu.
Como consigo realizar essa tarefa?

One Answer

Como as informações estão agrupadas em intervalos regulares, pode usar indexação condicional:

df2 <- data.frame(
  numero = df$Coluna[c(TRUE, FALSE, FALSE)],
  periodico = df$Coluna[c(FALSE, TRUE, FALSE)],
  qualis = df$Coluna[c(FALSE, FALSE, TRUE)]
)

> df2
     numero              periodico qualis
1 2237-5953  (RE) PENSANDO DIREITO     B4
2 2469-4312        [IN] TRANSITION     B2
3 1981-030X 19&20 (RIO DE JANEIRO)     B1
4 2053-1583           2D MATERIALS     A2

Se for usar spread ou outras funções similares, crie colunas de identificação primeiro, aproveitando-se da regularidade:

df$id <- rep(1:(nrow(df)/3), each = 3)
df$col <- c("numero", "periodico", "qualis")

> tidyr::pivot_wider(df, names_from = col, values_from = Coluna)
# A tibble: 4 x 4
    id numero    periodico              qualis
  <int> <fct>     <fct>                  <fct>
1     1 2237-5953 (RE) PENSANDO DIREITO  B4
2     2 2469-4312 [IN] TRANSITION        B2
3     3 1981-030X 19&20 (RIO DE JANEIRO) B1
4     4 2053-1583 2D MATERIALS           A2

> reshape2::dcast(df, id ~ col, value.var = "Coluna")
  id    numero              periodico qualis
1  1 2237-5953  (RE) PENSANDO DIREITO     B4
2  2 2469-4312        [IN] TRANSITION     B2
3  3 1981-030X 19&20 (RIO DE JANEIRO)     B1
4  4 2053-1583           2D MATERIALS     A2

Correct answer by Carlos Eduardo Lagosta on November 3, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP