Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R &引用;“模糊密钥匹配”;对于data.table合并_R_Data.table - Fatal编程技术网

R &引用;“模糊密钥匹配”;对于data.table合并

R &引用;“模糊密钥匹配”;对于data.table合并,r,data.table,R,Data.table,我正在尝试使用姓名字符串和经验度量来匹配每年的员工。经验每年最多只能增加一次,所以我想用它来帮助匹配其他指标失败的情况 例如: dt1<-data.table(name=c("jane doe","jane doe", "john doe","jane smith"), exp=c(0.,5,1,2),id=1:4,key="name") dt2<-data.table(name=c("jane doe",

我正在尝试使用姓名字符串和经验度量来匹配每年的员工。经验每年最多只能增加一次,所以我想用它来帮助匹配其他指标失败的情况

例如:

dt1<-data.table(name=c("jane doe","jane doe",
                       "john doe","jane smith"),
                exp=c(0.,5,1,2),id=1:4,key="name")
dt2<-data.table(name=c("jane doe","jane doe",
                       "john doe","jane smith"),
                exp=c(0,30,1.5,2),key="name")
但这不起作用——这给了我:

> dt2
         name  exp id flag
1:   jane doe  0.0  2    2
2:   jane doe 30.0 NA   NA
3: jane smith  2.0  4    4
4:   john doe  1.5  3    3
它似乎没有正确地匹配后一个“简·多伊”,但似乎将第一个“简·多伊”匹配到了错误的前一个“简·多伊”。我不太清楚这是为什么;无论如何,似乎最好在加入之前而不是加入之后在
exp
上合并匹配——这也会清理定义新变量时的
ifelse
混乱。有什么建议吗


为清楚起见,以下是所需的输出:

> dt2
         name  exp id flag
1:   jane doe  1.0  1    1
2:   jane doe 30.0 NA   NA
3: jane smith  2.0  4    1
4:   john doe  1.5  3    1

在您的情况下,连接并不是真正的“模糊”。您所要做的就是通过
name
by
exp
加入,同时允许每次比赛有一年的距离。这对于规格为
-1L
的滚动连接非常有用

首先,我们将正确地为数据集设置关键帧

setkey(dt1, name, exp) 
setkey(dt2, name, exp) 
然后,我们将执行滚动联接,同时将
-1L
作为其值传递

dt2[dt1, `:=`(id = i.id, flag = 1L), roll = -1L]
df2
#          name  exp id flag
# 1:   jane doe  0.0  1    1
# 2:   jane doe 30.0 NA   NA
# 3: jane smith  2.0  4    1
# 4:   john doe  1.5  3    1


将来,如果您需要执行区间连接,例如
c(1L,-1L)
,您可以查看
foverlaps
函数的一些示例。

您的问题不太清楚。是否要同时按
名称
exp
匹配?换句话说,
df1
中的所有“jane doe”都是不同的人?无论如何,我不完全确定,但可能您正在寻找
setkey(dt1,name,exp);设置键(dt2,名称,exp);dt2[dt1,id:=i.id,滚动=-1L]
?完美!从来都不太明白roll做了什么——终于找到了一个例子。所以
roll=-2L
将匹配任何
exp
最多少2个的人
roll=1L
将匹配具有
exp
最多1个的任何人,依此类推
roll=+Inf
对于任何
exp
较大者,code>roll=-Inf对于任何
exp
较小者。1内匹配如何
roll=c(-1L,1L)
不起作用,最近的
也不一定起作用。对于间隔,您可能需要查看
foverlaps
。。但是在
滚动中有一些FRs
。FRs?未来的修订?
dt2[dt1, `:=`(id = i.id, flag = 1L), roll = -1L]
df2
#          name  exp id flag
# 1:   jane doe  0.0  1    1
# 2:   jane doe 30.0 NA   NA
# 3: jane smith  2.0  4    1
# 4:   john doe  1.5  3    1