【问题标题】:left_join R dataframes, merging two columns with NAsleft_join R 数据框,将两列与 NA 合并
【发布时间】:2018-06-25 08:31:20
【问题描述】:

我的问题如下:假设我有一个包含以下列的现有数据框:UID、foo、结果。结果已部分填充。第二个模型现在预测额外的行,生成包含 UID 和结果列的第二个数据帧:(代码在底部重现)

## df_main
##    UID   foo result
##  <dbl> <chr>  <chr>
## 1     1   moo    Cow
## 2     2   rum   <NA>
## 3     3  oink   <NA>
## 4     4  woof    Dog
## 5     5  hiss   <NA>

## new_prediction
##    UID result
##  <dbl>  <chr>
## 1     3    Pig
## 2     5  Snake

我现在想通过 UID left_join 新结果以获得以下结果列:

## Cow
## <NA>
## Pig
## Dog
## Snake

但我无法让它工作,因为left_join(df_main, new_prediction, by="UID") 创建了result.x 和result.y。有什么办法可以用 dplyr 来做到这一点,或者是加入列的第二步?我查看了各种函数,但最终决定手动遍历所有行。我很确定有更“R”的方式来做到这一点?

数据框代码:

df_main <- tibble(UID = c(1,2,3,4,5), foo=c("moo", "rum", "oink", "woof", "hiss"), result=c("Cow", NA, NA, "Dog", NA))
new_prediction <- tibble(UID = c(3,5), result = c("Pig", "Snake"))

【问题讨论】:

  • 您可以在这些列上使用来自dplyr 的coalesce。

标签: r join dplyr left-join


【解决方案1】:

coalesce 是您的第二步。

left_join(df_main, new_prediction, by="UID") %>%
  mutate(result = coalesce(result.x, result.y)) %>%
  select(-result.x, -result.y)
# # A tibble: 5 x 3
#     UID   foo result
#   <dbl> <chr>  <chr>
# 1     1   moo    Cow
# 2     2   rum   <NA>
# 3     3  oink    Pig
# 4     4  woof    Dog
# 5     5  hiss  Snake

coalesce 将接受与您提供的一样多的列。如果有多个非缺失值,较早的列具有优先权。

【讨论】:

  • 这正是我所寻找的——我知道必须有一个“R”的方式来做到这一点。作为奖励,这甚至适用于超过 2 个向量,这在我的情况下很棒。谢谢!
【解决方案2】:

除了 Gregor 对使用 coalesce 的回答之外,您还可以“手动”加入带有 ifelse 的列。

left_join(df_main, new_prediction, by = "UID") %>%
  mutate(result = ifelse(is.na(result.x),result.y, result.x)) %>%
  select(-c(result.x, result.y))
# A tibble: 5 x 3
# UID foo   result
# <dbl> <chr> <chr> 
# 1  1.00 moo   Cow   
# 2  2.00 rum   <NA>  
# 3  3.00 oink  Pig   
# 4  4.00 woof  Dog   
# 5  5.00 hiss  Snake 

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多