合并Tibbles,但重写缺失值

时间:2017-12-13 21:08:12

标签: r join merge na tibble

我正在使用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

所有NAs或缺失值都被具有更多信息的更“优越”的行替换。我怎么能这样做?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

假设两个tibbles被称为ab,我们可以先将被视为缺失值的任何字符替换为NA(在这种情况下,&#34) ;&#34;被认为是NA)。 b[b == ""] <- NA是一种快速的方法。

之后,我们可以通过您知道已完成的列full_join进行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 是最终输出。

1st page
___________________________________
|qrcode 1|
|qrcode 2|
|qrcode 3|
|qrcode 4|
|qrcode 5|
____________________________________
2nd page
____________________________________
|qrcode 6|
|qrcode 7|
|qrcode 8|
|qrcode 9|
|qrcode10|
_____________________________________

答案 2 :(得分:0)

我们可以使用我的软件包safejoin中的safe_left_join,并使用     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