首页 > 解决方案 > Left_join 使用来自第二个数据帧的数据值填充 NA 条目

问题描述

我有两个相当复杂的 data.frames 并设法在这里简化了我的问题的第一步。我有一个参考表和另一个包含我的数据的表,如下所示:

参考

ref <- structure(list(group = c("A", "B", "C"), position = c("a", "a", 
"b")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

数据

df <- structure(list(position = c("a", "a"), value = c(1, 1, 2), name = c("foo", 
"bar")), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"))

我曾经left_join(ref,df,by="position") %>% arrange(name)获得:

1 A     a            1 foo  
2 A     a            1 bar  
3 B     a            1 foo  
4 B     a            1 bar  
5 C     b           NA NA

然而,理想的输出是:

  group position value name 
  <chr> <chr>    <dbl> <chr>
1 A     a            1 bar  
2 B     a            1 bar  
3 C     b            0 bar
4 A     a            1 foo  
5 B     a            1 foo  
6 C     b            0 foo

我希望名称列用 df 的输入替换 NA,并将值列的 NA 替换为 0。在真正的 df 中,我在名称列中有多个 foo

标签: rdplyrleft-join

解决方案


我们可以使用crossing来获取组合,然后replace将 'value' 列的值设置为 0,其中 'position' 列不相等

library(dplyr)
library(tidyr)
crossing(ref, df %>% 
                rename(position2 = position)) %>%
    arrange(name) %>%
    mutate(value = replace(value, position != position2 , 0)) %>% 
    select(-position2)
# A tibble: 6 x 4
#  group position value name 
#  <chr> <chr>    <dbl> <chr>
#1 A     a            1 bar  
#2 B     a            1 bar  
#3 C     b            0 bar  
#4 A     a            1 foo  
#5 B     a            1 foo  
#6 C     b            0 foo  

推荐阅读