避免R中的for循环
假设我有两个不同的数据集避免R中的for循环,r,R,假设我有两个不同的数据集Data1和Data2。对于Data1$incents中的每个条目,我希望在Data2$incents中找到与其匹配的行,并跟踪不匹配的条目。随后,我将匹配的条目保存到新的数据框Data1\u Matches。现在,对于Data2$incents中的每个条目,我在Data1\u Matches$incents中查找匹配的条目,然后创建一个类似的数据框Data2\u Matches 为便于讨论,假设我的数据集如下所示: Day Incidents "Monday"
Data1
和Data2
。对于Data1$incents
中的每个条目,我希望在Data2$incents
中找到与其匹配的行,并跟踪不匹配的条目。随后,我将匹配的条目保存到新的数据框Data1\u Matches
。现在,对于Data2$incents
中的每个条目,我在Data1\u Matches$incents
中查找匹配的条目,然后创建一个类似的数据框Data2\u 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,]
我目前的算法如下所示:
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,]
Data1\u Incs=as.integer(Data1$incents)
LEN1=长度(数据1_Incs)
不匹配=0
for(1:LEN1中的k){
Incs=哪个(Data2$incents==Data1\u Incs[k])
如果(长度(增量)==0){
不匹配=c(不匹配,k)
}
}
不匹配=不匹配[-1]
数据1_匹配尝试使用setdiff
我将在第一个for循环中演示:
No_Match <- setdiff(unique(Data2$Incidents), unique(Data1$Incidents))
No_Match如果您提供每个数据集的一个小的、自包含的样本,那么在什么意义上帮助匹配会容易得多?整排都一样吗?或者您是在使用一列或一组列作为键?@ulfeld我给出的示例数据集并不令人惊讶,但我的意思是在这个意义上进行匹配:对于Data1
中的每一行,我希望查看Data2$incents
中是否存在与Data1
中的单个条目相匹配的条目。如果没有匹配项,我会保存索引,以便将Data1
分为两个后续数据集:一个有匹配项,一个没有匹配项。@SeñorO我添加了一个代码“可能”样子的小样本。不幸的是,我不能分享实际内容。这个例子看起来有帮助吗?@Mnifldz这并不是很有帮助。阅读本文:可以想象,我不需要使用setdiff
的for循环,因为它将为我提供Data2$incents
中不包含的Data1$incents
中的(唯一)条目,对吗?如果是这样,我如何将Data1
子集化,以仅包含No_Match
中未包含的事件?这将为您提供实际值,从而消除获取子集然后对数据集进行子集化的额外步骤。谢谢setdiff
是我所需要的。我能够完全删除for循环,我的脚本现在运行得非常快。