使用R

时间:2018-07-12 17:54:51

标签: r sorting for-loop

我正在尝试找到一种更快的替代方法,以便将 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中是否有任何人都知道的排序/比较算法?预先感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:2)

您可以在sql中或使用sqldf在R中非常轻松地完成这种事情。

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)))}))