【问题标题】:instead of NA, is it possible to get left_join / right_join to fill rows that were not joined with something else?而不是 NA,是否可以让 left_join / right_join 填充未与其他内容连接的行?
【发布时间】:2021-10-05 18:38:20
【问题描述】:
> data.frame(A=1:10, B=1:10) |> dplyr::left_join(data.frame(A=1:5, C=1:5, D=1:5))
Joining, by = "A"
    A  B  C  D
1   1  1  1  1
2   2  2  2  2
3   3  3  3  3
4   4  4  4  4
5   5  5  5  5
6   6  6 NA NA
7   7  7 NA NA
8   8  8 NA NA
9   9  9 NA NA
10 10 10 NA NA

我可以告诉 left_join 代替 NA 来填充不能用其他东西连接的单元格吗?

【问题讨论】:

  • 之后你可以这样做%>% replace(., is.na(.), -999)
  • 当存在不是由于加入的 NA 时不起作用。这正是需要此功能的原因。如果 NA 已经存在,那么这 2 种类型的 NA 就会合并。

标签: r dplyr tidyverse


【解决方案1】:

我们可以写一个函数:在这里学习:R Left Outer Join with 0 Fill Instead of NA While Preserving Valid NA's in Left Table

library(dplyr)
library(tidyr) 

left_join_999 <- function(x, y, fill = 999, ...){
  z <- left_join(x, y, ...)
  new_cols <- setdiff(names(z), names(x))
  z <- replace_na(z, setNames(as.list(rep(fill, length(new_cols))), new_cols))
  z
}

left_join_999(df1, df2, by="A")

输出:

  A  B   C   D
1   1  1   1   1
2   2  2   2   2
3   3  3   3   3
4   4  4   4   4
5   5  5   5   5
6   6  6 999 999
7   7  7 999 999
8   8  8 999 999
9   9  9 999 999
10 10 10 999 999

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2011-03-25
    • 2019-09-12
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多