Набор данных WDI не особенно велик, поэтому я подозреваю, что ваша команда gather
исключает столбцы, уникальные для каждой строки, что вызывает огромное количество дубликатов, например, дополнительный столбец года, такой как 2018
.
Вы могли бы быть более явным с помощью вашей команды select
, чтобы избежать этого, положительно выбирая только нужные вам столбцы, а не отрицательно исключая определенные столбцы, например так ...
library(readr)
library(dplyr)
library(tidyr)
url <- "http://databank.worldbank.org/data/download/WDI_csv.zip"
zippath <- tempfile(fileext = ".zip")
download.file(url, zippath)
csvpath <- unzip(zippath, files = "WDIData.csv", exdir = tempdir())
WDI <- readr::read_csv(csvpath)
WDI %>%
select(`Country Name`, `Country Code`, `Indicator Code`, `1960`:`2017`) %>%
gather(Year, val,`1960`:`2017`) %>%
spread(`Indicator Code`, val)
, или вы можете быть уверены, чточто столбцы, которые вам не нужны при изменении формы, исключаются, например, так:
library(readr)
library(dplyr)
library(tidyr)
url <- "http://databank.worldbank.org/data/download/WDI_csv.zip"
zippath <- tempfile(fileext = ".zip")
download.file(url, zippath)
csvpath <- unzip(zippath, files = "WDIData.csv", exdir = tempdir())
WDI <- readr::read_csv(csvpath)
WDI %>%
select(-`Indicator Name`, -`2018`, -`X64`) %>%
gather(Year, val,`1960`:`2017`) %>%
spread(`Indicator Code`, val)
вы также можете избежать некоторого увеличения среднего размера, используя опцию gather
na.rm = TRUE
, которая может ускоритьвсе немного ...
library(readr)
library(dplyr)
library(tidyr)
url <- "http://databank.worldbank.org/data/download/WDI_csv.zip"
zippath <- tempfile(fileext = ".zip")
download.file(url, zippath)
csvpath <- unzip(zippath, files = "WDIData.csv", exdir = tempdir())
WDI <- readr::read_csv(csvpath)
WDI %>%
select(-`Indicator Name`, -`2018`, -`X64`) %>%
gather(Year, val,`1960`:`2017`, na.rm = TRUE) %>%
spread(`Indicator Code`, val)
и для более подробного объяснения, обратите внимание, что произойдет, если вы "случайно" не включите 2017 в свою команду сбора, используя пример набора данных, который вы создали выше...
library(data.table)
WDI <- fread("CountryName CountryCode IndicatorName IndicatorCode 1960 1961 2017
ArabWorld ARB A FX.OWN.TOTL.ZS 37.16521072 37.16521072 37.16521072
ArabWorld ARB B FX.OWN.TOTL.FE.ZS 25.63540268 25.63540268 25.63540268
ArabWorld ARB C FX.OWN.TOTL.MA.ZS 48.32851791 48.32851791 48.32851791
ArabWorld ARB D FX.OWN.TOTL.OL.ZS 42.54204559 42.54204559 42.54204559
ArabWorld ARB E FX.OWN.TOTL.40.ZS 27.72478104 27.72478104 27.72478104
ArabWorld ARB F FX.OWN.TOTL.PL.ZS 26.45811081 26.45811081 26.45811081
ArabWorld ARB G FX.OWN.TOTL.60.ZS 43.44695282 43.44695282 43.44695282
ArabWorld ARB H FX.OWN.TOTL.SO.ZS 48.66697693 48.66697693 48.66697693
ArabWorld ARB I FX.OWN.TOTL.YG.ZS 20.95479965 20.95479965 20.95479965
", header = TRUE)
library(dplyr)
library(tidyr)
WDI %>%
select(-`IndicatorName`) %>%
gather(Year, val,`1960`:`1961`) %>%
spread(`IndicatorCode`, val)