【问题标题】:How to replace values in differents columns with values in another column? (R)如何用另一列中的值替换不同列中的值? (右)
【发布时间】:2021-02-05 21:24:48
【问题描述】:

图书馆(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 

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    我们可以使用

    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       
    

    【讨论】:

      【解决方案2】:

      不整洁,但带有apply 的基本 R 选项。

      cols <- grep('replace', names(df))
      df[] <- trimws(t(apply(df, 1, function(x) {x[is.na(x)] <- x[cols];x})))
      
      #   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     
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        • 2021-04-24
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多