【问题标题】:Splitting multiple string columns and rename the new columns adequately- R拆分多个字符串列并充分重命名新列-R
【发布时间】:2020-11-24 17:26:00
【问题描述】:

我有一个包含大量字符串列的数据框。 这些列中的每一列都包含我想拆分的三个部分的字符串。所以最后字符串列的总数将增加三倍。 这样做时,我还想通过将某些预定义的字符串附加到它们的原始列名来直接命名新列。

作为一个简化的例子

test_frame<-tibble(x=c("a1!","b2@","c3$"), y=c("A1$","G2%", NA))

x       y
a1!    A1$
b2@    G2%  
c3$    NA

应该变成类似

x_letter   x_number   x_sign    y_letter    y_number    y_sign
a          1          !         A           1           $      
b          2          @         G           2           %
c          3          $         NA          NA          NA

字符串中元素的顺序始终相同。

真实的数据框有超过 100 个字符串列,所有这些列都可以使用分隔符分成三个部分。唯一的例外可能是缺少字符串的行。 我研究了 str_split_fixed()、strsplit() 和separate() 以及应用函数的组合,但不知道如何在循环遍历列的同时直接命名列。

这里有什么简单的方法?

【问题讨论】:

    标签: r string loops split


    【解决方案1】:

    这应该是你所需要的,不是最干净的解决方案而是简单

    library(tidyverse)
    
    test_frame<-tibble(x=c("a1!","b2@","c3$"), y=c("A1$","G2%", NA))
    
    
    pipe_to_do <- . %>%
      str_split_fixed(string = .,pattern = "(?<=.)",n = 3) %>% 
      as_tibble() %>% 
      rename(letter = V1,
             number = V2,
             sign = V3)
    
    xx <- test_frame %>%
      summarise(across(everything(),.fns = pipe_to_do))
    #> Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
    #> Using compatibility `.name_repair`.
    #> This warning is displayed once every 8 hours.
    #> Call `lifecycle::last_warnings()` to see where this warning was generated.
    
    
    names_xx <- names(xx)
    
    combine_names <- function(df,name) {
      str_c(name,"_",df)
    }
    
    combine_names_func <- function(df,name){
      df %>% 
        rename_with(.fn = ~ combine_names(.x,name))
    }
    
    map2(xx,names_xx,combine_names_func) %>% 
      reduce(bind_cols)
    #> # A tibble: 3 x 6
    #>   x_letter x_number x_sign y_letter y_number y_sign
    #>   <chr>    <chr>    <chr>  <chr>    <chr>    <chr> 
    #> 1 a        1        !      "A"      "1"      "$"   
    #> 2 b        2        @      "G"      "2"      "%"   
    #> 3 c        3        $      ""       ""       ""
    

    reprex package (v0.3.0) 于 2020 年 8 月 4 日创建

    【讨论】:

      【解决方案2】:

      你可以使用str_extract:

      library(stringr)
      df <- data.frame(
        x_letter = str_extract(test_frame$x,"^[a-z]"),
        x_number = str_extract(test_frame$x,"(?<=^[a-z])[0-9]"),
        x_sign = str_extract(test_frame$x,".$"),
        y_letter = str_extract(test_frame$y,"^[A-Z]"),
        y_number = str_extract(test_frame$y,"(?<=^[A-Z])[0-9]"),
        y_sign = str_extract(test_frame$y,".$")
      )
      

      结果:

      df
        x_letter x_number x_sign y_letter y_number y_sign
      1        a        1      !        A        1      $
      2        b        2      @        G        2      %
      3        c        3      $     <NA>     <NA>   <NA>
      

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 2021-03-07
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多