Эффективное изменение больших наборов данных - PullRequest
1 голос
/ 08 июля 2019

Индикатор мирового развития выглядит следующим образом

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 <- WDI %>% 
  select(-`Indicator Name`) %>% 
  gather(Year, val,`1960`:`2017`) %>% 
  spread(`Indicator Code`, val)

Раньше он работал безлюбые проблемы, но по какой-то причине теперь требуется слишком много памяти для завершения операции.

Я пытался удалить все другие базы данных из рабочего пространства, gc(), закрывая все другие программы на компьютере.и сократить годы, используемые для изменения, но это не решило проблему.В результате я задаюсь вопросом, существует ли менее интенсивный способ памяти для решения этой проблемы.


РЕДАКТИРОВАТЬ 1: Согласно этому post dcast.data.table или reshape (из-за нехватки памяти) это путь.Однако у меня много проблем с переписыванием синтаксиса (я также получил ответ dplyr на мою публикацию вопроса) Как мне переписать dplyr код для использования dcast / reshape?

Как используются термины select, gather, spread, относится к dcast и изменению формы?


РЕДАКТИРОВАТЬ 2: Сначала я попытался расплавить таблицу data.table следующим образом:

WDI = melt(WDI, id.vars = c("IndicatorCode", "CountryName", "CountryCode"),
               #  measure.vars = -c("IndicatorCode", "CountryName", "CountryCode", "IndicatorName"))
                measure.vars = c("1960", "1961","2017"))
colnames(WDI)[4] <- "year"
WDI = dcast(WDI, CountryName + CountryCode + year ~ IndicatorCode, value.var="value")

Но тогда я получаю «предупреждение» Aggregation function missing: defaulting to length и все записи равны 1 вместо значений.По-видимому, это происходит, когда комбинация записей не уникальна.Однако я вполне уверен, что они есть (комбинация страны и индикатора должна сделать запись уникальной).

1 Ответ

1 голос
/ 09 июля 2019

Набор данных 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...