我正在尝试使用名称字符串和经验来匹配年复一年的工人。经验每年最多只能增加一次,因此我希望在其他指标失败时使用它来帮助匹配。
例如:
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
答案 0 :(得分:5)
在您的情况下,加入并非真实&#34;模糊&#34;。您要做的就是name
加exp
加入,同时每场比赛允许一年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';
// ....
函数的一些示例