簡體   English   中英

使用 dplyr 替換來自不同 dataframe 的多個列

[英]Replacing multiple columns from different dataframe using dplyr

我有兩個數據框,其中一個包含 ID 的子集和另一個的列(但具有不同的值)。

ds1 <- data.frame(id = c(1:4),
                      d1 = "A",
                      d2 = "B",
                      d3 = "C")


ds2 <- data.frame(id = c(1,2),
                     d1 = "W",
                     d2 = "X")

我希望在 d1 上使用 dplyr 來查找共享列,並將它們的值替換為 d2 中找到的值,匹配 ID。 我可以像這樣一次改變它們:

ds1 %>% 
  mutate(d1 = ifelse(id %in% ds2$id, ds2$d1[ds2$id==id],d1),
         d2 = ifelse(id %in% ds2$id, ds2$d2[ds2$id==id],d2))

然而,在我的實際情況下,我需要這樣做 47 次。 憑借 cross across()的穩健性,我覺得有更好的方法。 我也對非 dplyr 解決方案持開放態度。

您可能需要使用dplyrstringr (也可以在沒有stringr的情況下完成)


library(tidyverse)

ds1 %>% left_join(ds2, by = 'id') %>%
  mutate(across(ends_with('.y'), ~ coalesce(., get(str_replace(cur_column(), '.y', '.x'))))) %>%
  select(!ends_with('.x')) %>%
  rename_with(~str_remove(., '.y'), ends_with('.y'))

#>   id d3 d1 d2
#> 1  1  C  W  X
#> 2  2  C  W  X
#> 3  3  C  A  B
#> 4  4  C  A  B

代表 package (v2.0.0) 於 2021 年 5 月 10 日創建

這有點類似於我的朋友親愛的@AnilGoyal 發布的,與你的相比也有點冗長,你可以將它用於更大的數據集:

library(dplyr)
library(stringr)


ds1 %>%
  left_join(ds2, by = "id") %>% 
  mutate(across(ends_with(".x"), ~ ifelse(!is.na(get(str_replace(cur_column(), ".x", ".y"))), 
                                          get(str_replace(cur_column(), ".x", ".y")), 
                                          .x))) %>%
  select(!ends_with(".y")) %>%
  rename_with(~ str_remove(., ".x"), ends_with(".x"))


  id d1 d2 d3
1  1  W  X  C
2  2  W  X  C
3  3  A  B  C
4  4  A  B  C

使用rows_update

library(tidyverse)
ds1 <- data.frame(id = c(1:4),
                  d1 = "A",
                  d2 = "B",
                  d3 = "C")


ds2 <- data.frame(id = c(1,2),
                  d1 = "W",
                  d2 = "X")

rows_update(x = ds1, y = ds2, by = "id")
#>   id d1 d2 d3
#> 1  1  W  X  C
#> 2  2  W  X  C
#> 3  3  A  B  C
#> 4  4  A  B  C

代表 package (v2.0.0) 於 2021 年 5 月 11 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM