【问题标题】:Parallelization of merge by row.names of two large matrices通过两个大矩阵的 row.names 并行化合并
【发布时间】:2014-05-05 13:45:54
【问题描述】:

我正在尝试将 R 中 row.names 的两个大型矩阵与 merge 合并,但这需要相当长的时间。是否有可能并行化 merge 方法?也许以某种方式使用foreach 库?或者也许有更快的解决方案可以完成这项工作?

我有 8 个内核和 24 GB 的 RAM。这两个矩阵大约为 1.4 Gb,由约 900 行和约 22000 列组成。

这里是重现我的数据集的一个小例子的代码:

df1 <- data.frame(x = 1:3, y = 1:3, row.names = c('r1', 'r2', 'r3'))
df2 <- data.frame(z = 5:7, row.names = c('r1', 'r3', 'r7'))
dfMerged <- merge(df1, df2, by = "row.names", all = TRUE)
dfMerged[is.na(dfMerged)] <- 0

【问题讨论】:

  • 不完全是你要找的东西,但data.table 可能会更快一些(相对于data.frame

标签: r merge parallel-processing parallel-foreach


【解决方案1】:

data.table 中的相同合并应该更快。我认为它也应该是并行可行的,但它可能会变得更加复杂。这是data.table 中的相同合并。

#Create data.table objects
dt1 <- data.table(x = 1:3, y = 1:3, var=c('r1', 'r2', 'r3'))
dt2 <- data.table(z = 5:7, var = c('r1', 'r3', 'r7'))

#Set merge keys
setkey(dt1,var)
setkey(dt2,var)

#Perform full outer join
dtMerged <- merge(dt1,dt2,all=T)

#Replace NAs with zeros (edited for more efficient answer suggest by Arun)
for (j in c("x", "y", "z")) 
  set(dtMerged, i=which(is.na(dtMerged[[j]])), j=j, value=0L)
dtMerged

var x y z
1:  r1 1 1 5
2:  r2 2 2 0
3:  r3 3 3 6
4:  r7 0 0 7

【讨论】:

  • 不完全确定在这种情况下如何执行此操作(扫描所有列)。这会比dtMerged[,lapply(.SD,FUN=function(x) ifelse(is.na(x),0,x))] 快​​吗?
猜你喜欢
  • 2014-05-05
  • 2023-03-09
  • 2014-08-16
  • 1970-01-01
  • 2019-09-23
  • 2017-05-16
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多