R使用rdist在数据表中生成结果

R使用rdist在数据表中生成结果,r,data.table,distance,euclidean-distance,R,Data.table,Distance,Euclidean Distance,我正试图加快涉及距离矩阵的计算速度。 下面的代码片段在它所来自的脚本中工作,但速度较慢。它选择特定国家、年份和情景组合,计算MFAD,并将组合信息(包括MFAD结果和rbinds)写入MFAD文件夹 MFADHolder <- data.table(scenario = character(0), region_code.IMPACT159 = character(0), year = character(0), MFAD = numeric(0)) for (k in yearList

我正试图加快涉及距离矩阵的计算速度。 下面的代码片段在它所来自的脚本中工作,但速度较慢。它选择特定国家、年份和情景组合,计算MFAD,并将组合信息(包括MFAD结果和
rbind
s)写入MFAD文件夹

MFADHolder <- data.table(scenario = character(0), region_code.IMPACT159 = character(0), year = character(0), MFAD = numeric(0)) 
for (k in yearList) {           
  for (l in scenList) {         
    for (n in ctylist) {            
      dt <- dt.main[ year == k & scenario == l & region_code.IMPACT159 == n,]           
      itemlist <- unique(dt$IMPACT_code)            
      dt[,c("scenario", "region_code.IMPACT159", "year", "IMPACT_code") := NULL]            
      d <- as.data.table(rdist(dt))         
      data.table::setnames(d, old = names(d), new = itemlist)           
      MFAD <- sum(d)/20         
      newRow <- as.list(c(l,n,k,MFAD))          
      MFADHolder <- rbind(MFADHolder, newRow)           
    }           
  }         
}
其思想是只在dt.main中的相关列上运行
rdist
,替换上面的dt copy代码,然后对距离矩阵中的所有元素求和,除以20,并将所有结果写入MFAD列

当我运行它时,它永远不会完成,R也会死掉,因为我的mac耗尽了系统内存和/或硬盘空间不足

下面是演示该问题的完整代码

library(data.table)
library(fields) # needed for rdist function
dt.main <- readRDS("dt.main.rds")
dt.main[, MFAD := sum(rdist(dt.main[,!(c("scenario", "region_code.IMPACT159", "year", "nutrient"))]))/len.nutlist,
        by = c("scenario", "year", "region_code.IMPACT159")]
库(data.table)
库(字段)#rdist函数需要

dt.mainJohn Smith的代码基本上正是我所需要的,但没有按编写的那样运行

下面的版本确实如此,而且速度非常快

cols <- setdiff(colnames(dt.main), c("scenario", "region_code.IMPACT159", "year", "nutrient"))
system.time(dt.main[, `:=` (MFAD = sum(rdist(.SD)) / .N),
           by = c("scenario", "year", "region_code.IMPACT159"), .SDcols = cols])

cols能否请您提供一些示例数据,以便问题可以重现。您确定您的代码没有bug吗?似乎没有影响,而是营养素,不管怎样,这就是你想要的吗<代码>系统时间(dt.main[,
:=
(MFAD=sum(rdist(.SD))/.N),by=c(“场景”、“年份”、“区域代码影响159”),.SDcols=cols])
注意
.N
因为我不知道什么是
len.nutlist
以及
cols的位置,因为符号“`”在文本中有特殊含义。很高兴这有帮助:)
library(data.table)
library(fields) # needed for rdist function
dt.main <- readRDS("dt.main.rds")
dt.main[, MFAD := sum(rdist(dt.main[,!(c("scenario", "region_code.IMPACT159", "year", "nutrient"))]))/len.nutlist,
        by = c("scenario", "year", "region_code.IMPACT159")]
cols <- setdiff(colnames(dt.main), c("scenario", "region_code.IMPACT159", "year", "nutrient"))
system.time(dt.main[, `:=` (MFAD = sum(rdist(.SD)) / .N),
           by = c("scenario", "year", "region_code.IMPACT159"), .SDcols = cols])