r - R data.table 的合并指示器?
问题描述
我的问题与这个问题有关,但它正在询问dplyr
解决方案。
我想做的是执行外连接并创建一个指示变量来解释合并结果,就像pandas
或STATA
会做的那样。
具体来说,我希望_merge
在完全外连接操作之后有一个列,指示与 left_only 或 right_only 或两者的合并结果,如下例所示。
更新:我更新了示例
key1 = c('a','b','c','d','e')
v1 = c(1,2,3, NA, 5)
key2 = c('a','b','d','f')
v2 = c(4,5,6,7)
df1 = data.frame(key=key1,v1)
df2 = data.frame(key=key2,v2)
> df1
key v1
1: a 1
2: b 2
3: c 3
4: d NA
5: e 5
> df2
key v2
1: a 4
2: b 5
3: d 6
4: f 7
# merge result I'd like to have
key v1 v2 _merge
1: a 1 4 both
2: b 2 5 both
3: c 3 NA left_only
4: d NA 6 both # <- not right_only, both
5: e 5 NA left_only
6: f NA 7 right_only
我想知道我是否缺少现有data.table
功能,还是有一种简单的方法来完成这项任务?
解决方案
您可以使用merge.data.table
withall=TRUE
进行完全外连接:
library(data.table)
setDT(df1)
setDT(df2)
DT <- merge(df1[, r1 := .I], df2[, r2 := .I], by="key", all=TRUE)
DT[, merge_ := "both"][
is.na(r1), merge_ := "right_only"][
is.na(r2), merge_ := "left_only"]
输出:
key v1 r1 v2 r2 merge_
1: a 1 1 4 1 both
2: b 2 2 5 2 both
3: c 3 3 NA NA left_only
4: d NA NA 6 3 right_only
数据:
key1 = c('a','b','c')
v1 = c(1,2,3)
key2 = c('a','b','d')
v2 = c(4,5,6)
df1 = data.frame(key=key1,v1)
df2 = data.frame(key=key2,v2)
正如 Michael Chirico 所说data.table_1.13.0
,2020 年 7 月 24 日发布,也可以使用fcase
如下:
DT[, merge_ := fcase(
is.na(r1), "right_only",
is.na(r2), "left_only",
default = "both"
)]
推荐阅读
- python - 是否可以选择要在 Python 中打印的字典键?
- excel - MacOs 上的 VBA 函数 ActiveWorkbook.SaveAs
- angular - Angular Material Dialog,无法动态更新数据
- python - @staticmethod 是否在 CPython 或 Micropython 中保存任何 ram?
- matlab - Matlab 和 fortran 精度
- javascript - 为什么按钮可见性首先发生变化,而标签可见性第二,延迟很大?
- graph - Grafana图形跳跃/刷新时闪烁
- sql - 查询以使用进入条件填充排行榜
- excel - 将excel中的多列堆叠成两列集
- javascript - 按元素频率 JavaScript 对数组进行排序