Возникли проблемы с использованием функции «собирать» в Tidyr - PullRequest
0 голосов
/ 02 ноября 2019

У меня проблемы с использованием функции сбора в R. Это примерный фрейм данных -

library(dplyr)
library(tidyr)
DF = data.frame(Region = c("Asia", "Asia", "Asia", "Europe", "Europe"),
                `Indicator Name` = c("Population", "GDP", "GNI", "Population", "GDP"),
                `2004` = c(22, 33,44,55,56),
                `2005` =c(223, 44,555,66,64))

Region Indicator.Name X2004 X2005
1   Asia     Population    22   223
2   Asia            GDP    33    44
3   Asia            GNI    44   555
4 Europe     Population    55    66
5 Europe            GDP    56    64

А это тот фрейм данных, который мне нужен


DF2 = data.frame(Region = c("Asia", "Asia", "Europe", "Europe"),
                 Year =  c("X2004", "X2005"),
                 population = c(22, 224, 55, 66),
                 GDP = c(33, 44, 56,64))

Region  Year population GDP
1   Asia X2004         22  33
2   Asia X2005        224  44
3 Europe X2004         55  56
4 Europe X2005         66  64

Я хочусделать это через функцию gather в tidyr. Я не уверен, как идти об этом. Это то, что я пытался -

gather(DF, key= DF$Indicator.Name, values = "values")

Ответы [ 2 ]

4 голосов
/ 02 ноября 2019

Используя gather и spread, вы получите:

DF %>% 
  gather(-Indicator.Name, -Region, key= "Year", value = "value") %>%
  spread(Indicator.Name, value)
4 голосов
/ 02 ноября 2019

Это не простая функция gather. Сначала вам нужно сделать длинный кадр данных, а затем сделать его широким, переключая нужные столбцы.
Вот решение с использованием новых функций pivot_longer и pivot_wider.

library(dplyr)
library(tidyr)

DF = data.frame(Region = c("Asia", "Asia", "Asia", "Europe", "Europe"),
                `Indicator Name` = c("Population", "GDP", "GNI", "Population", "GDP"),
                `2004` = c(22, 33,44,55,56),
                `2005` =c(223, 44,555,66,64))



DF %>% pivot_longer(cols = starts_with("x")) %>% pivot_wider(names_from = Indicator.Name, values_from = value) 

# A tibble: 4 x 5
Region name  Population   GDP   GNI
<fct>  <chr>      <dbl> <dbl> <dbl>
1 Asia   X2004         22    33    44
2 Asia   X2005        223    44   555
3 Europe X2004         55    56    NA
4 Europe X2005         66    64    NA
...