data.table合并的“模糊密钥匹配”

时间:2015-04-26 04:19:38

标签: 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","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 上 - 这也会在定义新变量时清除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

1 个答案:

答案 0 :(得分:5)

在您的情况下,加入并非真实&#34;模糊&#34;。您要做的就是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)等间隔加入,您可以查看foverlaps class Google_DriveService extends Google_Service { public $about; public $apps; public $changes; public $children; public $comments; public $files; public $parents; public $permissions; public $replies; public $revisions; /** * Constructs the internal representation of the Drive service. * * @param Google_Client $client */ public function __construct(Google_Client $client) { //LINE 1021 $this->servicePath = 'drive/v2/'; $this->version = 'v2'; $this->serviceName = 'drive'; // .... 函数的一些示例