首页 > 解决方案 > 使用 R 中的嵌套 for 循环更快地替代成对比较

问题描述

我试图找到一个更快的替代方法来比较数据帧X中的每个观测值i和观测值j。例如,运行以下代码

for(i in 1:nrow(X)){
 for(j in 1:nrow(X)){
   if ( (sum(c(X$Feature1[i], X$Feature1[j])) == 0)&& ((X$Feature2[i] == X$Feature2[j])|(X$Feature3[i] == X$Feature3[j]) ) ){ 
  X$match[i]<-1
}}}

运行 20,000 个左右的观测值需要相当长的时间。R中是否有任何人都知道的排序/比较算法?在此先感谢您的时间!

标签: rsortingfor-loop

解决方案


您可以在 sql 中或在 R 中使用sqldf.

X$match <- seq(nrow(X))
library(sqldf)
X$match <- sqldf("
  select    sum(b.Feature1 is not null) > 0 as match
  from      X a 
            left join X b
              on  a.Feature1 + b.Feature1 = 0
                  and (
                  a.Feature2 = b.Feature2
                  or a.Feature3 = b.Feature3)
  group by  a.match
  ")[[1]]

基本 R 版本可能是

X$match <- as.numeric(
            sapply(seq(nrow(X)), function(i){
                    any( (X$Feature1[i] + X$Feature1 == 0)
                         & (
                           (X$Feature2[i] == X$Feature2)
                           | (X$Feature3[i] == X$Feature3)))}))

推荐阅读