R使用rdist在数据表中生成结果
我正试图加快涉及距离矩阵的计算速度。 下面的代码片段在它所来自的脚本中工作,但速度较慢。它选择特定国家、年份和情景组合,计算MFAD,并将组合信息(包括MFAD结果和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
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])