传播函数返回两列之一中的所有“ NA”

时间:2019-05-03 16:17:50

标签: r dplyr tidyr spread

我正在使用自己的版本的gapminder数据集,并试图查看哪个国家从2008年到2018年实现了最大的增长。当我使用原始的gapminder数据时,效果很好,但由于某些原因,我无法复制在我自己的数据集上?问题是我不能使用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) 

0 个答案:

没有答案