【问题标题】:How to rename all columns to middle separator in R?如何将所有列重命名为R中的中间分隔符?
【发布时间】:2022-06-25 18:50:54
【问题描述】:

我正在寻找一种简单的解决方案,将我的列重命名为仅中间分隔符。这是一些模拟数据。

dat <- data.frame(
  
  subject = paste("Subject", 1:10),
  CT_tib_all = round(rnorm(10, 0.25, 0.03), 2),
  CT_lum_all = round(rnorm(10, 0.25, 0.03), 2),
  CT_tho_all = round(rnorm(10, 0.25, 0.03), 2)
  
)

我想从这里开始:

    subject CT_tib_all CT_lum_all CT_tho_all
1 Subject 1       0.25       0.27       0.26
2 Subject 2       0.24       0.19       0.21

到这里:

    subject        tib        lum        tho
1 Subject 1       0.25       0.27       0.26
2 Subject 2       0.24       0.19       0.21

【问题讨论】:

    标签: r


    【解决方案1】:

    可能有更优雅的解决方案,但试试这个:

    colnames(dat)[-1] <- sapply(strsplit(colnames(dat[-1]), "_"), function(x) x[2])
    
    #> dat
    #      subject  tib  lum  tho
    #1   Subject 1 0.17 0.21 0.20
    #2   Subject 2 0.27 0.23 0.28
    # ...
    

    这会忽略第一列 (subject),sapply() 将查找其余列的下划线之间的所有内容。

    【讨论】:

      【解决方案2】:

      使用 {tidyverse},您可以使用 dplyr::rename_with() 并提供一个在 _ 处拆分并获取第二个元素的函数。

      library(tidyverse)
      
      dat <- data.frame(
        subject = paste("Subject", 1:10),
        CT_tib_all = round(rnorm(10, 0.25, 0.03), 2),
        CT_lum_all = round(rnorm(10, 0.25, 0.03), 2),
        CT_tho_all = round(rnorm(10, 0.25, 0.03), 2)
      )
      
      # create renaming function
      f <- function(x) {
        x %>% 
          str_split("_") %>% 
          map(~.x[2]) %>% 
          unlist()
      }
      
      # rename with function at specified positions
      dat %>% 
        rename_with(f, -1)
      #>       subject  tib  lum  tho
      #> 1   Subject 1 0.28 0.25 0.23
      #> 2   Subject 2 0.26 0.25 0.26
      #> 3   Subject 3 0.28 0.29 0.25
      #> 4   Subject 4 0.30 0.26 0.24
      #> 5   Subject 5 0.22 0.24 0.23
      #> 6   Subject 6 0.26 0.28 0.29
      #> 7   Subject 7 0.26 0.22 0.26
      #> 8   Subject 8 0.29 0.26 0.25
      #> 9   Subject 9 0.24 0.32 0.26
      #> 10 Subject 10 0.21 0.23 0.27
      

      reprex package (v2.0.1) 于 2022-05-01 创建

      【讨论】:

        【解决方案3】:

        另一个选项使用rename_with()str_extract() 来提取两个“_”之间的字符串并相应地重命名列,不包括第一列。

        library(dplyr)
        library(stringr)
        
        rename_with(dat, ~str_extract(.x, '(?<=_).*?(?=_)'), .cols = -1)
        

        同样使用purrr:map()如下

        library(purrr)
        
        colnames(dat)[-1] <- map_chr(colnames(dat)[-1], ~strsplit(.x,'_')[[1]][2])
        

        【讨论】:

          猜你喜欢
          • 2023-02-13
          • 2021-12-15
          • 1970-01-01
          • 2019-12-17
          • 2013-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          相关资源
          最近更新 更多