gpt4 book ai didi

r - "fuzzy key matching"用于 data.table 合并

转载 作者:行者123 更新时间:2023-12-04 11:00:26 25 4
gpt4 key购买 nike

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

例如:

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")

我想将 dt1 中的第一个“jane doe”与 dt2 中的第一个“jane doe”相匹配。后面的“jane doe”不匹配,因为他们显然是不同的人(基于截然不同的经验水平)。

我还想添加一些标志,以了解我稍后以这种方式匹配这些人。这是我的第一遍:

dt2[dt1,`:=`(id=ifelse(exp<=i.exp+1,i.id,NA),
flag=ifelse(exp<=i.exp+1,i.id,NA))]

但这是行不通的——这是给我的结果:

> 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

似乎正确地错过了后面的“jane doe”匹配,但似乎将第一个“jane doe”匹配到错误的前面的“jane doe”。我不太确定这是为什么;无论如何,似乎最好有一种方法在 exp before 而不是在加入之后合并匹配——这也会清理 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

最佳答案

在您的情况下,连接并不是真正的“模糊”。您要做的就是通过 exp 通过 name 加入,同时允许每场比赛有 1 年的距离。这对于具有 -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),您可以看一下 here foverlaps 函数的一些示例。

关于r - "fuzzy key matching"用于 data.table 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29873688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com