【问题标题】:"fuzzy key matching" for a data.table mergedata.table 合并的“模糊键匹配”
【发布时间】:2015-04-26 04:19:38
【问题描述】:

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

例如:

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

【问题讨论】:

  • 你的问题不太清楚。你想同时匹配name exp吗?换句话说,df1 中的所有“jane doe”都是不同的人?
  • 无论如何,我不完全确定,但也许你正在寻找setkey(dt1, name, exp) ; setkey(dt2, name, exp) ; dt2[dt1, id := i.id, roll = -1L]
  • 完美!一直不太明白roll 做了什么——终于找到了一个例子。所以roll=-2L 将匹配任何exp 最多2个; roll=1L 将匹配任何与exp 最多1 更多,等等。 roll=+Inf 用于任何exp 更大,roll=-Inf 用于任何exp 更少。匹配 within 1 怎么样? roll=c(-1L,1L) 无效,nearest 不一定有效。
  • 对于间隔,你可能想看看foverlaps.. 但是roll..上有一些FRs。
  • FR?未来的修订?

标签: r data.table


【解决方案1】:

在您的情况下,连接并不是真的“模糊”。您要做的就是通过nameexp 加入,同时每场比赛允许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 函数的一些示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 2018-06-09
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多