根据第一个匹配项从 Dataframe 中的多个列之一合并

zdwk9cvp  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(106)

假设我有两个dataframe,如下所示:

V1 V2 V3  
A  A1 A11  
A  A1 NA   
B  B2 NA    
B  NA NA   
NA NA NA
geo value
A     5
A1    3
A11   1
B     6
B2    7
B21   9

我想将第二个 Dataframe 的“值”合并到第一个 Dataframe 中,尽可能地以最好的geo值合并。所以,对于第一行,我想基于列V3合并,因为它有一个值。然而,第二行只有V2,所以我想基于V2合并,而不是基于列V3合并。所需的输出如下:

V1 V2 V3  Value
A  A1 A11  1
A  A1 NA   3
B  B2 NA   7  
B  NA NA   6
NA NA NA  NA

我可以执行多个合并,但这最终会创建多个冗余的“Value.x”,“Value.y”等列。是否有一种方法可以基于第一个匹配列进行合并,然后在前一个(更精细)列中有NA值的情况下继续进行下一个匹配列?

osh3o9ms

osh3o9ms1#

dplyrcoalesce函数的工作方式与SQL中的相同,从可能值列表中输出第一个非NA值,我们可以根据偏好指定。我们可以基于此进行连接。

library(dplyr)
df1 %>%
  mutate(finest = coalesce(V3, V2, V1)) %>%
  left_join(df2, by = c("finest" = "geo"))

结果

V1   V2   V3 finest value
1    A   A1  A11    A11     1
2    A   A1 <NA>     A1     3
3    B   B2 <NA>     B2     7
4    B <NA> <NA>      B     6
5 <NA> <NA> <NA>   <NA>    NA
x0fgdtte

x0fgdtte2#

你可以在Base R中这样做:
它根据pmax的返回进行一些匹配

df1$Value = df2$value[match(do.call(pmax,  c(rev(df1), na.rm = T)), df2$geo)]
V1   V2   V3 Value
1    A   A1  A11     1
2    A   A1 <NA>     3
3    B   B2 <NA>     7
4    B <NA> <NA>     6
5 <NA> <NA> <NA>    NA

相关问题