基于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)