嵌套连接使 x
几乎保持不变,只是它添加了一个新的列表列,其中每个元素包含 y
中与 x
中相应行匹配的行。
用法
nest_join(x, y, by = NULL, copy = FALSE, keep = NULL, name = NULL, ...)
# S3 method for data.frame
nest_join(
x,
y,
by = NULL,
copy = FALSE,
keep = NULL,
name = NULL,
...,
na_matches = c("na", "never"),
unmatched = "drop"
)
参数
- x, y
-
一对数据帧、数据帧扩展(例如 tibble)或惰性数据帧(例如来自 dbplyr 或 dtplyr)。有关更多详细信息,请参阅下面的方法。
- by
-
使用
join_by()
创建的连接规范,或要连接的变量的字符向量。如果
NULL
(默认值),*_join()
将使用x
和y
之间的所有共同变量执行自然连接。一条消息列出了变量,以便您可以检查它们是否正确;通过显式提供by
来抑制该消息。要连接
x
和y
之间的不同变量,请使用join_by()
规范。例如,join_by(a == b)
将匹配x$a
到y$b
。要连接多个变量,请使用带有多个表达式的
join_by()
规范。例如,join_by(a == b, c == d)
将x$a
与y$b
匹配,将x$c
与y$d
匹配。如果x
和y
之间的列名称相同,您可以通过仅列出变量名称来缩短列名称,例如join_by(a, c)
。join_by()
还可用于执行不等式连接、滚动连接和重叠连接。有关这些类型的连接的详细信息,请参阅?join_by 中的文档。对于简单的等式连接,您也可以指定要连接的变量名称的字符向量。例如,
by = c("a", "b")
将x$a
连接到y$a
并将x$b
连接到y$b
。如果x
和y
之间的变量名称不同,请使用命名字符向量,例如by = c("x_a" = "y_a", "x_b" = "y_b")
。要执行交叉联接,生成
x
和y
的所有组合,请参阅cross_join()
。 - copy
-
如果
x
和y
不是来自同一个数据源,并且copy
是TRUE
,则y
将被复制到与x
相同的源中。这允许您跨 src 连接表,但这是一项潜在昂贵的操作,因此您必须选择它。 - keep
-
新的列表列是否应该包含连接键?默认情况下将保留不等式连接的连接键。
- name
-
由连接创建的列表列的名称。如果
NULL
(默认值),则使用y
的名称。 - ...
-
传递给方法的其他参数。
- na_matches
-
两个
NA
或两个NaN
值应该匹配吗? - unmatched
-
应如何处理会导致删除行的不匹配键?
-
"drop"
从结果中删除不匹配的键。 -
如果检测到不匹配的键,
"error"
会引发错误。
unmatched
旨在防止您在连接期间意外删除行。它仅检查输入中可能会删除行的不匹配键。-
对于左连接,它检查
y
。 -
对于右连接,它检查
x
。 -
对于内部联接,它检查
x
和y
。在这种情况下,unmatched
也可以是长度为 2 的字符向量,以独立指定x
和y
的行为。
-
值
输出:
-
与
x
类型相同(包括具有相同的组)。 -
与
x
具有完全相同的行数。 -
包含
x
的所有列,顺序相同且值相同。仅当keep = FALSE
时,它们才会被(轻微)修改,此时by
中列出的列将被强制为x
和y
中的通用类型。 -
在最右侧获得一个名为
{name}
的新列,这是一个包含与y
类型相同的数据帧的列表列。
与其他连接的关系
您可以根据嵌套连接的结果重新创建许多其他连接:
-
inner_join()
是nest_join()
加上tidyr::unnest()
。 -
left_join()
是nest_join()
加上tidyr::unnest(keep_empty = TRUE)
。 -
semi_join()
是nest_join()
加上filter()
,您可以在其中检查数据的每个元素是否至少有一行。 -
anti_join()
是nest_join()
加上filter()
,您可以在其中检查每个元素是否有零行。
也可以看看
其他连接:cross_join()
、filter-joins
、mutate-joins
例子
df1 <- tibble(x = 1:3)
df2 <- tibble(x = c(2, 3, 3), y = c("a", "b", "c"))
out <- nest_join(df1, df2)
#> Joining with `by = join_by(x)`
out
#> # A tibble: 3 × 2
#> x df2
#> <dbl> <list>
#> 1 1 <tibble [0 × 1]>
#> 2 2 <tibble [1 × 1]>
#> 3 3 <tibble [2 × 1]>
out$df2
#> [[1]]
#> # A tibble: 0 × 1
#> # ℹ 1 variable: y <chr>
#>
#> [[2]]
#> # A tibble: 1 × 1
#> y
#> <chr>
#> 1 a
#>
#> [[3]]
#> # A tibble: 2 × 1
#> y
#> <chr>
#> 1 b
#> 2 c
#>
相关用法
- R dplyr nest_by 由一个或多个变量嵌套
- R dplyr near 比较两个数值向量
- R dplyr nth 从向量中提取第一个、最后一个或第 n 个值
- R dplyr n_distinct 计算独特的组合
- R dplyr na_if 将值转换为 NA
- R dplyr ntile 将数值向量分为 n 组
- R dplyr group_trim 修剪分组结构
- R dplyr slice 使用行的位置对行进行子集化
- R dplyr copy_to 将本地数据帧复制到远程src
- R dplyr sample_n 从表中采样 n 行
- R dplyr consecutive_id 为连续组合生成唯一标识符
- R dplyr row_number 整数排名函数
- R dplyr band_members 乐队成员
- R dplyr mutate-joins 变异连接
- R dplyr coalesce 找到第一个非缺失元素
- R dplyr group_split 按组分割 DataFrame
- R dplyr mutate 创建、修改和删除列
- R dplyr order_by 用于排序窗口函数输出的辅助函数
- R dplyr context 有关“当前”组或变量的信息
- R dplyr percent_rank 比例排名函数
- R dplyr recode 重新编码值
- R dplyr starwars 星球大战人物
- R dplyr desc 降序
- R dplyr between 检测值落在指定范围内的位置
- R dplyr cumall 任何、全部和平均值的累积版本
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Nest join。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。