【发布时间】: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