【问题标题】:How can I merge to update two dfs which have same col names?如何合并以更新具有相同列名的两个 dfs?
【发布时间】:2021-08-27 11:03:36
【问题描述】:

我有一个包含电子邮件列表的数据框,其中一些位于 NA。数据框有一个 ID 列,没有 NA。 前几天我得到了一些包含一些新信息的数据。它是一个包含新电子邮件信息和相应 ID 的数据框。 我希望将此添加到我的电子邮件列表中。起初,我认为使用full_join()left_join() 会是一个很好的方法。但是这样,添加的电子邮件列被识别为新列。我不想添加新列,我想更新电子邮件列。 有没有一个简单的解决方案来完成这个? 为了以简单的方式显示这种情况,我生成了以下数据。

电子邮件列表:

> email_df <- tibble(
+   id = 1:10,
+   email = rnorm(10, 1000, 10)  # Here, each number is an individual e-mail address.
+ )
> email_df[c(1,3,5,7,9), 2] <- NA  # These lines are missing values.
> email_df
# A tibble: 10 x 2
      id email
   <int> <dbl>
 1     1   NA 
 2     2 1000.
 3     3   NA 
 4     4  989.
 5     5   NA 
 6     6 1011.
 7     7   NA 
 8     8 1000.
 9     9   NA 
10    10  987.

新信息:

> new_infomation <- tibble(
+   id = c(1,3,5,7),
+   email = rnorm(4, 1000, 10)
+ )
> new_infomation
# A tibble: 4 x 2
     id email
  <dbl> <dbl>
1     1  990.
2     3 1006.
3     5 1007.
4     7 1009.

糟糕的解决方案:

> full_join(email_df, new_infomation, by = "id")
# A tibble: 10 x 3
      id email.x email.y
   <dbl>   <dbl>   <dbl>
 1     1     NA     990.
 2     2   1000.     NA 
 3     3     NA    1006.
 4     4    989.     NA 
 5     5     NA    1007.
 6     6   1011.     NA 
 7     7     NA    1009.
 8     8   1000.     NA 
 9     9     NA      NA 
10    10    987.     NA 

当然,这个数据可以固定如下,但是在我看来太冗长了。

> full_join(email_df, new_infomation, by = "id") %>% 
+   mutate(
+     email = ifelse(!is.na(email.x), email.x, email.y)
+   ) %>% 
+   select(id,email)
# A tibble: 10 x 2
      id email
   <dbl> <dbl>
 1     1  990.
 2     2 1000.
 3     3 1006.
 4     4  989.
 5     5 1007.
 6     6 1011.
 7     7 1009.
 8     8 1000.
 9     9   NA 
10    10  987.

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    这里可以使用来自dplyrrows_update函数。

    library(dplyr)
    
    email_df %>% rows_update(new_infomation, by = 'id')
    
    #      id email
    #   <int> <dbl>
    # 1     1  984.
    # 2     2 1008.
    # 3     3  997.
    # 4     4  997.
    # 5     5  990.
    # 6     6 1001.
    # 7     7 1006.
    # 8     8 1008.
    # 9     9   NA 
    #10    10 1000.
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2014-09-28
      • 2016-09-04
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多