r - 如果 column2 是 NA 加入 column1 否则加入 column1 和 column2
问题描述
我敢肯定这个问题以前被问过,但我找不到我一生的答案。我想使用 dplyr 将两个 tibbles 连接在一起。如果第二列是 NA 则只需加入第一列。如果第二列不是 NA,则加入第一列和第二列。下面的解决方案不起作用,但这是我正在尝试做的。
library(tidyverse)
df1 <- tibble(x = c("Name", "City", "City"), y = c("Table5", "Table1", "Table2"))
df2 <- tibble(x2 = c("Name", "City", "City"), y2 = c(NA, "Table1", "Table2"), z = c("a", "b", "c"))
joined_data <- if (is.na(df2$y2)) {
df1 %>%
left_join(df2, by = c("x" = "x2"))
} else {
df1 %>%
left_join(df2, by = c("x" = "x2", "y" = "y2"))
}
最终结果应该是
x y z
<chr> <chr> <chr>
1 Name Table5 a
2 City Table1 b
3 City Table2 c
解决方案
我们首先找到所有NA
索引,然后将它们加入两个单独的调用中。对于非 NA 索引,我们将它们连接起来x
,y
而对于 NA 索引,我们仅将它们连接起来,并在和使用x
之间选择非 NA 值,然后将行绑定在一起。y
y2
coalesce
library(tidyverse)
NAinds <- is.na(df2$y2)
df1[!NAinds,] %>%
left_join(df2, by = c("x" = "x2", "y" = "y2")) %>%
bind_rows(df1[NAinds, ] %>%
left_join(df2, by = c("x" = "x2")) %>%
mutate(y = coalesce(y, y2)) %>%
select(-y2))
# x y z
# <chr> <chr> <chr>
#1 City Table1 b
#2 City Table2 c
#3 Name Table5 a
推荐阅读
- python - TypeError:不支持的操作数类型 -:python 日志记录模块中的“str”和“str”
- node.js - Mongodb:将原始集合预计算为多个(10k +)较小的集合?
- css - 如何从带有字幕的引导轮播中删除缩放效果?
- c# - c# 通过遍历树递归打印
- c++ - Visual Studio Project 2019 项目仍需要 msvcr120d.dll
- java - 获取表格 DB XXX.0E0(XX 代表数字)
- solr - 如何在 solr 中为 txt(或配置)文件中的关键字应用提升
- csv - 合并大的 csv 文件
- python - 附加键:未添加到 Python 字典的值
- c - 相同的 srand 种子在不同的计算机上产生不同的值