首页 > 解决方案 > 如何用另一列中的值替换不同列中的值?(右)

问题描述

图书馆(tidyverse)

reprex 让您重现:

library(tidyverse)

tibble(
  x1 = c(1, 2, NA, NA, 5),
  y1 = c(4, 3, NA, NA, 7),
  x2 = c(NA, NA, 6, 7, NA),
  y2 = c(NA, NA, 2, 4, NA),
  replace1 = c("A", "B", "C", "D", "E"),
  replace2 = c("F", "G", "H", "I", "J")
)

我有这个数据框:

# A tibble: 5 x 6
     x1    y1    x2    y2 replace1 replace2
  <dbl> <dbl> <dbl> <dbl> <chr>    <chr>   
1     1     4    NA    NA A        F       
2     2     3    NA    NA B        G       
3    NA    NA     6     2 C        H       
4    NA    NA     7     4 D        I       
5     5     7    NA    NA E        J

我需要数据框是这样的,哪个 tidyverse 管道可以让我做到这一点?

# A tibble: 5 x 6
  x1    y1    x2    y2    replace1 replace2
  <chr> <chr> <chr> <chr> <chr>    <chr>   
1 1     4     A     F     A        F       
2 2     3     B     G     B        G       
3 C     H     6     2     C        H       
4 D     I     7     4     D        I       
5 5     7     E     J     E        J 

标签: rdataframedplyrtidyverse

解决方案


我们可以用

library(dplyr)
library(stringr)
df1 %>% 
     mutate(across(1:4, ~ coalesce(as.character(.), 
        get(str_replace(cur_column(), "\\D+", "replace")))))

-输出

# A tibble: 5 x 6
#  x1    y1    x2    y2    replace1 replace2
#  <chr> <chr> <chr> <chr> <chr>    <chr>   
#1 1     4     F     F     A        F       
#2 2     3     G     G     B        G       
#3 C     C     6     2     C        H       
#4 D     D     7     4     D        I       
#5 5     7     J     J     E        J       

或者如果它基于'x','y'

 df1 %>% 
     mutate(replace_x = replace1, replace_y = replace2) %>% 
     mutate(across(1:4, ~ coalesce(as.character(.), 
         get(str_replace(cur_column(), "(\\D+)\\d+", "replace_\\1"))))) %>%   
     select(-matches('replace_[xy]'))
# A tibble: 5 x 6
#  x1    y1    x2    y2    replace1 replace2
#  <chr> <chr> <chr> <chr> <chr>    <chr>   
#1 1     4     A     F     A        F       
#2 2     3     B     G     B        G       
#3 C     H     6     2     C        H       
#4 D     I     7     4     D        I       
#5 5     7     E     J     E        J       

推荐阅读