我在 R 中有两个数据框,我想有条件地将它们合并到id和 上day。合并是right合并到left变量的变量尽可能是新的/新鲜的/最近的,但必须至少是三天前的。
但是,如果没有匹配的right,以我的id-date在对left我还是想留住他们。我的研究有两个部分,所以我不想放弃的id-day意见,只是因为他们是不完整的。
我可以sqldf一步完成吗?我目前的方法需要一个额外的基础 R merge。
left <- data.frame(id=rep(1:5, each=10),
day=rep(1:10, times=5),
x=rnorm(5*10))
right <- data.frame(id=rep(1:2, each=21),
day=rep(-10:10, times=2),
y=rnorm(2*21))
combined <- sqldf("SELECT L.id, L.day, L.x, R.y
FROM left L LEFT OUTER JOIN right R
ON (L.id = R.id)
WHERE ((L.day - R.day) >= 3)
GROUP BY L.id, L.day
HAVING (R.day = MAX(R.day))")
combined
combined.2 <- merge(left, combined, all=TRUE)
combined.2
Run Code Online (Sandbox Code Playgroud)
尝试像这样嵌套 select 语句:
sqldf("SELECT * from left
LEFT JOIN (SELECT id, L.day, L.x, R.y
FROM left L LEFT OUTER JOIN right R
USING (id)
WHERE ((L.day - R.day) >= 3)
GROUP BY L.id, L.day
HAVING (R.day = MAX(R.day)))
USING (id, day, x)")
Run Code Online (Sandbox Code Playgroud)
这也可以如下进行。它使用的事实是,如果使用 max,则同一结果行上的其他值保证来自与 max 相同的原始行。这是 SQLite 提供的 SQL 扩展。
sqldf("select max(R.day) as maxRday, L.*, R.y
from left L left outer join right R
on L.id = R.id and L.day - R.day >= 3
group by L.id, L.day")[-1]
Run Code Online (Sandbox Code Playgroud)