我正在使用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或缺失值都被具有更多信息的更“优越”的行替换。我怎么能这样做?
答案 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
被称为a
和b
,我们可以先将被视为缺失值的任何字符替换为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