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?
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP