Функция Spread, возвращающая все «NA» в пределах одного из двух столбцов - PullRequest
1 голос
/ 03 мая 2019

Я использую свою собственную версию набора данных гэпминдера и пытаюсь увидеть, какая страна достигла наибольшего роста с 2008 по 2018 год. Когда я использую исходные данные гэпиндера, он работает нормально, но по какой-то причине я не могу воспроизвестина моем собственном наборе данных?Проблема в том, что я не могу использовать na.locf(), потому что все строки "2008" заполняются до "2018"

Я использую функцию распространения, но она возвращает значения таким образом, что я не могу перенести последнее наблюдениевперед и функция group_by, похоже, не работает

# The code on the original data that works fine
library(gapminder)
gapminder %>% 
  filter(year %in% c("1952", "1957")) %>% 
  spread(year, pop) %>% 
  na.locf() %>% 
  mutate(diff = `1957` - `1952`)

Однако, когда я использую свой набор данных (структура такая же), он изменяет данные таким образом, который трудно вычесть

> class(gapminder_df$Year)
[1] "integer"

> class(gapminder_df$population)
[1] "numeric"

# and 

> nrow(gapminder_df[gapminder_df$Year == "2018",])
[1] 134
> nrow(gapminder_df[gapminder_df$Year == "2008",])
[1] 134
top_10 <- gapminder_df %>% 
  filter(Year %in% c("2008", "2018")) %>%
  spread(Year, population) %>% 
  na.locf()

первый столбец имеет NA для первой половины строк, а второй столбец возвращает NA для второй половины, и поэтому я не могу вычесть ... group_by(country) не дает желаемогорезультаты:

  2018     2008     country
1   NA 27300000 Afghanistan
2   NA  2990000     Albania
3   NA 34900000     Algeria
4   NA 21800000      Angola

вот пример данных

gapminder_df <- tibble(

  Country = c(rep("Afganistan", 4), rep("Albania", 4), rep("Algeria",4),rep("Angola",4)),
  Year = rep(c("2008", "2009", "2018", "2004"), 4),
  population = rnorm(16, mean = 5000000, sd = 50)

)

РЕДАКТИРОВАТЬ: Мне удалось исправить это, выбрав только соответствующие столбцы перед распространением ..Может кто-нибудь объяснить мне, почему это работает?Я предполагаю, что у меня было несколько одинаковых дат для одних и тех же стран с множеством разных значений для других переменных?


top_10 <- gapminder_df %>%
  select(country, Year, population) %>% 
  filter(Year %in% c("2008", "2018")) %>%
  spread(Year, population) 

...