如何在R中按列two及日期前置条件实现Inner Join?
在R中实现带日期条件的内连接
当然可以实现,不过需要先注意你提供的b数据框列名存在混淆:按照需求描述和期望结果,连接的分组键应该是a$two(分组值a/b)和b$three(分组值a/b),而日期条件是a$one < b$two。以下是两种常用实现方式:
方法一:使用dplyr包
dplyr的语法更直观,适合数据处理新手:
library(dplyr) # 按分组列执行内连接,筛选日期条件,再为每个a的行取符合条件的最小b日期 result_final <- inner_join(a, b, by = c("two" = "three")) %>% filter(one < two.y) %>% group_by(one, two) %>% slice_min(two.y, n = 1) %>% ungroup() %>% rename(three = two.y) %>% select(one, two, three) # 查看结果 result_final
方法二:使用data.table包
如果处理大数据集,data.table的效率更高:
library(data.table) # 转换为data.table对象 setDT(a) setDT(b) # 执行连接、筛选、取最小日期操作 result_final <- b[a, on = .(three = two), allow.cartesian = TRUE][ one < two, .SD[which.min(two)], by = .(one, two) ] %>% setnames("two", "three") %>% setcolorder(c("one", "two", "three")) # 查看结果 result_final
运行上述代码后,得到的result_final会和你提供的result完全一致。
内容的提问来源于stack exchange,提问作者Inuraghe
相关产品推荐
相关产品推荐

