基于R中另一个数据帧的值有条件地将1或0分配给新列

基于R中另一个数据帧的值有条件地将1或0分配给新列,r,R,我有一个data.frame,有32000个条目。以下是一个示例: # df1 MINEVENT MAXEVENT EVENTRANGE NUMEVENT cplt_flag 2680001 2680051 2680001-2680051 51 0 2680001 2680051 2680001-2680051 51 0 2680001 2680051 2680001-2680051 51

我有一个
data.frame
,有32000个条目。以下是一个示例:

# df1
MINEVENT MAXEVENT      EVENTRANGE NUMEVENT cplt_flag
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
# df2
source_id
   211535
   211535
   211535
   211536
   211536
   211536
还有一个有157个值的列表。以下是一个示例:

# df1
MINEVENT MAXEVENT      EVENTRANGE NUMEVENT cplt_flag
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
 2680001  2680051 2680001-2680051       51         0
# df2
source_id
   211535
   211535
   211535
   211536
   211536
   211536
我想从
源id
中读取数据,并测试该值是否介于
MINEVENT
MAXEVENT
之间。如果
TRUE
则我想在
cplt\u标志
中输入一个值
1
,否则
0

我有一个使用
if-else
语句的代码,但是对于
32000
条目,它运行得非常慢。此外,我一直在尝试使用函数和应用函数,但无法实现这一点


我正在寻找一种有效的方法来完成这项工作。

您的数据集实际上没有任何情况下会出现
真实的
场景。。但是这里有一个解决方案,它使用了data.table v1.9.7当前开发版本中新的非equi联接特性。请参阅安装说明

require(data.table)#v1.9.7+
setDT(df2)
setDT(df1)[df2,cplt_标志:=1,on=(MINEVENT=source_id)]

对于
df2
中的每一行,如果满足提供给
on=
参数的条件,则从
df1
中提取匹配的行索引。在这些行索引上,
cplt_flag
使用
1

更新到位,这是一种替代解决方案,使用
匹配.criteria
函数和应比循环更快的应用函数之一。我添加了一些额外的数据行以进行测试(不是详尽的,而是说明性的):


@阿伦r-金徽章的魔力;-)
require(foreach)
foreach(source.id = df2$source_id) %do% match.criterion(source.id, df1)