0

我正在使用以下两个小标题加入full_join

library(dplyr)
library(tibble)

tibble(id=c(1:2, NA), b = c("mouse", "cat", "fish"), c = 6:8) %>% 
full_join(tibble(id=1:3, b = c("mouse", "", "fish"), c = 6:8))

这会给我:

A tibble: 5 x 3
 id     b     c
 1 mouse     6
 2   cat     7
NA  fish     8
 2           7
 3  fish     8

理想情况下,我想得到类似的东西:

A tibble: 5 x 3
 id     b     c
 1 mouse     6
 2   cat     7
 3  fish     8

所有 NA 或缺失值都被替换为具有更多信息的更“高级”行。我怎样才能做到这一点?

4

3 回答 3

1

关于您的具体示例,我认为您的问题是如何组合两个小标题,而每个小标题都有不同的不完整观察结果(行)。在进行之前full_join,您可以使用 清除您的数据filter_all

filter_all(all_vars( (!is.na(.)) & (.!="") ) )

所以这意味着选择满足两个条件的行(对于所有变量):不是 NA 和“”。

tb1 <- tibble(id=c(1:2, NA), b = c("mouse", "cat", "fish"), c = 6:8) 
tb1 <- tb1%>% filter_all(all_vars((!is.na(.))&(.!="")))
> tb1
# A tibble: 3 x 3
   id    b         c
  <int> <chr> <int>
1     1 mouse     6
2     2 cat       7

对花药组做同样的事情,然后做full_join.

tb2 <- tibble(id=1:3, b = c("mouse", "", "fish"), c = 6:8)
tb2 <- tb2 %>% filter_all(all_vars((!is.na(.))&(.!="")))
full_join(tb1,tb2)
Joining, by = c("id", "b", "c")
# A tibble: 3 x 3
     id b         c
  <int> <chr> <int>
1     1 mouse     6
2     2 cat       7
3     3 fish      8
于 2018-06-06T01:29:45.793 回答
0

我们可以safe_left_join从我的包中使用safejoin,并用于 dplyr::coalesce处理列冲突。

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)

a <- tibble(id=c(1:2, NA), b = c("mouse", "cat", "fish"), c = 6:8)
b <- tibble(id=1:3, b = c("mouse", "", "fish"), c = 6:8)

解决方案:

b[b==""] <- NA
safe_left_join(a, b, by = "c", conflict = coalesce)
# # A tibble: 3 x 3
#      id b         c
#   <int> <chr> <int>
# 1     1 mouse     6
# 2     2 cat       7
# 3     3 fish      8
于 2019-02-26T01:09:23.987 回答
0

假设这两个tibbles被称为aand b,我们可以首先替换任何被认为是缺失值的字符NA(在这种情况下,“”被认为是NA)。b[b == ""] <- NA是一个快速的方法来做到这一点。

之后,我们可以full_join通过您知道的列完成(在本例中为 column c)。最后,我们可以使用该coalesce函数替换NA为两个关联的列。dat是最终的输出。

library(dplyr)
library(tibble)

# Create example data frame
a <- tibble(id=c(1:2, NA), b = c("mouse", "cat", "fish"), c = 6:8)
b <- tibble(id=1:3, b = c("mouse", "", "fish"), c = 6:8)

# Replace "" with NA
b[b == ""] <- NA

# Conduct full_join by c
dat <- full_join(a, b, by = "c") %>%
  # Use coalesce to merge column and replace NA
  mutate(id = coalesce(.$id.x, .$id.y),
         b = coalesce(.$b.x, .$b.y)) %>%
  # Select columns
  select(id, b, c)

# View the results
dat
# # A tibble: 3 x 3
#      id b         c
#   <int> <chr> <int>
# 1     1 mouse     6
# 2     2 cat       7
# 3     3 fish      8
于 2018-01-22T01:53:03.860 回答