在R中避免for循环

时间:2015-08-04 23:01:52

标签: r

假设我有两个不同的数据集Data1Data2。对于Data1$Incidents中的每个条目,我想在Data2$Incidents中找到与之匹配的行,并跟踪没有匹配的条目。随后,我将匹配的条目保存到新数据框Data1_Matches中。现在,对于Data2$Incidents中的每个条目,我会查找匹配的Data1_Matches$Incidents条目,然后创建一个类似的数据框Data2_Matches

假设为了参数我的数据集如下所示:

Day    Incidents
"Monday"    30
"Friday"    11
"Sunday"    27

我的算法目前如下所示:

Data1_Incs = as.integer(Data1$Incidents)
LEN1     = length(Data1_Incs)
No_Match = 0

for (k in 1:LEN1){
  Incs = which(Data2$Incidents == Data1_Incs[k])
  if (length(Incs) == 0){
    No_Match = c(No_Match,k)
  }
}
No_Match = No_Match[-1]

Data1_Match    <- Data1[-No_Match,]
Data1_No_Match <- Data1[ No_Match,]

Data2_Incs = Data2$Incidents
LEN2       = length(Data2_Incs)
Un_Match   = 0

for (j in 1:LEN2){
  Incs = which(as.integer(Data1_Match$Incidents) == Data2_Incs[j])
  if (length(Incs) == 0){
    Un_Match = c(Un_Match, j)
  }
}
Un_Match = Un_Match[-1]

Data2_Match    <- Data2[-Un_Match,]
Data2_No_Match <- Data2[ Un_Match,]

在不使用for循环的情况下,完成此任务的更好方法是什么?作为参考,Data1有大约15,000个条目,而Data2接近200万。

1 个答案:

答案 0 :(得分:3)

尝试使用setdiff

我将在第一个for循环中演示:

No_Match <- setdiff(unique(Data2$Incidents), unique(Data1$Incidents))

不确定这是否完全符合您的要求。