r - tbl 的 left_join:na_matches 不起作用
问题描述
left_join
在小标题或数据帧上使用 NA 值按预期工作,但在 tbl 上,它似乎与 NA 不匹配,即使使用选项 na_matches = "na"。
R 版本和包版本
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin18.6.0 (64-bit)
Running under: macOS Mojave 10.14.6
...
other attached packages:
[1] reprex_0.3.0 dbplyr_1.4.2 lubridate_1.7.4 magrittr_1.5 forcats_0.4.0 stringr_1.4.0 dplyr_0.8.1 purrr_0.3.2 readr_1.3.1
[10] tidyr_0.8.3 tibble_2.1.3 ggplot2_3.2.0 tidyverse_1.2.1
...
以下是 SQLite 的一个代表,但 PostgreSQL 也是如此(我实际上偶然发现了 PostgreSQL DB 的问题)。
最小的代表。
(1) 我创建了 2 个数据框,将它们本地复制到 SQLite DB,然后再次将它们加载为 tbl。
library(tidyverse)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
df_1 <- tibble(A = c("a", "aa"), B = c("b", "bb"), D = c("d", NA))
df_2 <- tibble(A = c("a", "aa"), C = c("c", "cc"), D = c("d", NA))
copy_to(con, df_1, overwrite = T)
copy_to(con, df_2, overwrite = T)
dt_1 <- tbl(con, "df_1")
dt_2 <- tbl(con, "df_2")
df_1
#> # A tibble: 2 x 3
#> A B D
#> <chr> <chr> <chr>
#> 1 a b d
#> 2 aa bb <NA>
df_2
#> # A tibble: 2 x 3
#> A C D
#> <chr> <chr> <chr>
#> 1 a c d
#> 2 aa cc <NA>
dt_1
#> # Source: table<df_1> [?? x 3]
#> # Database: sqlite 3.29.0 [:memory:]
#> A B D
#> <chr> <chr> <chr>
#> 1 a b d
#> 2 aa bb <NA>
dt_2
#> # Source: table<df_2> [?? x 3]
#> # Database: sqlite 3.29.0 [:memory:]
#> A C D
#> <chr> <chr> <chr>
#> 1 a c d
#> 2 aa cc <NA>
(2) 然后我使用left_join
, 首先在数据帧上,然后在 tbls 上:
left_join(df_1, df_2)
#> Joining, by = c("A", "D")
#> # A tibble: 2 x 4
#> A B D C
#> <chr> <chr> <chr> <chr>
#> 1 a b d c
#> 2 aa bb <NA> cc
left_join(dt_1, dt_2, na_matches = "na")
#> Joining, by = c("A", "D")
#> # Source: lazy query [?? x 4]
#> # Database: sqlite 3.29.0 [:memory:]
#> A B D C
#> <chr> <chr> <chr> <chr>
#> 1 a b d c
#> 2 aa bb <NA> <NA>
我们可以看到,在数据帧的情况下(默认情况下),第二行最后一列C
具有预期的值,但在 tbl 的情况下,即使使用了显式选项(根据文档,这是默认值)。 这是意料之外的。 cc
na_matches = "na"
<NA>
na_matches = "na"
编辑
请注意,这与具有 的数据帧的情况相同na_matches = "never"
:
left_join(df_1, df_2, na_matches = "never")
#> Joining, by = c("A", "D")
#> # A tibble: 2 x 4
#> A B D C
#> <chr> <chr> <chr> <chr>
#> 1 a b d c
#> 2 aa bb <NA> <NA>
顺便说一句,标题提到left_join
是因为它是最常见的连接,但同样的问题出现在inner_join
(full_join
还没有用于数据表),如果我们同时保留na_matches = "na"
两者可能会更明显:
inner_join(dt_1, dt_2, na_matches = "na")
#> Joining, by = c("A", "D")
#> # Source: lazy query [?? x 4]
#> # Database: sqlite 3.29.0 [:memory:]
#> A B D C
#> <chr> <chr> <chr> <chr>
#> 1 a b d c
inner_join(df_1, df_2, na_matches = "na")
#> Joining, by = c("A", "D")
#> # A tibble: 2 x 4
#> A B D C
#> <chr> <chr> <chr> <chr>
#> 1 a b d c
#> 2 aa bb <NA> cc
解决方案
推荐阅读
- user-interface - f# visual studio code gui 如何在 Mac osx 上使用 open System.Windows.Forms
- android - 如何在android中正确写入文件以使其可供ADB使用?
- c# - 使用 BindableObject 实现 IValueConverter 并且绑定的属性始终是默认值
- node.js - 一种在 Node JS 中不使用 process.stdout.write 来输出日志的方法?
- java - 以编程方式设置 Android 选项菜单项背景
- java - 反序列化多态 JSON 字符串
- angular - @angular/router 的 loadChildren 中的 gen 路径名
- java - 根据条件将常数值分配给不同变量中的一个
- angular-material - 为什么我的不行
加载时是否选择了指定值? - java - htm2pdf itextpdf外部css不生效