有效地重塑大型数据集

汤姆

世界发展指标如下

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:根据这篇文章 dcast.data.tablereshape(因为没有用完内存)是要走的路。但是,我在重写语法时遇到了很多麻烦(我在发布问题时也得到了dplyr的答复)如何dplyr使用dcast / reshape重写代码?

怎么办条款selectgatherspread涉及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而不是值。当条目的组合不是唯一的时,显然会发生这种情况。但是,我非常确定它们是(国家和指标的结合,应该使条目唯一)。

CJ Yetman

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)

您也可以使用gatherna.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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章