【问题标题】:Rename specific column names in a data frame (in R)重命名数据框中的特定列名(在 R 中)
【发布时间】:2021-10-08 14:58:21
【问题描述】:

我有一个数据框,我想在列名前面放置以下单词:“high_”和“low_”。 X2-X4 列的名称应重命名为 eg.high_X2 和 X5-X7 例如。低_X6。

请看下面的例子。

  X1 X2 X3 X4 X5 X6 X7
a 1  0  1  1  1  1  0
b 2  2  1  1  1  1  0

结果

  X1 high_X2 high_X3 high_X4 low_X5 low_X6 low_X7
a 1  0  1  1  1  1  0
b 2  2  1  1  1  1  0

【问题讨论】:

    标签: r dataframe rename


    【解决方案1】:

    基本解决方案(对于这类事情更严格)

    df <- data.frame(X1=c(a=1L,b=2L),
                     X2=c(a=0L,b=2L),
                     X3=c(a=1L,b=1L),
                     X4=c(a=1L,b=1L),
                     X5=c(a=1L,b=1L),
                     X6=c(a=1L,b=1L),
                     X7=c(a=1L,b=1L))
    cn <- colnames(df)
    cond <- as.integer(substr(cn,2L,nchar(cn))) %% 2L == 0L
    colnames(df)[cond] <- paste0(cn[cond],"_is_pair")
    

    一个 tidyverse 解决方案(由于 tidyeval 有点尴尬)

    library(dplyr)
    library(stringr)
    library(tidyselect)
    df <- data.frame(X1=c(a=1L,b=2L),
                     X2=c(a=0L,b=2L),
                     X3=c(a=1L,b=1L),
                     X4=c(a=1L,b=1L),
                     X5=c(a=1L,b=1L),
                     X6=c(a=1L,b=1L),
                     X7=c(a=1L,b=1L))
    
    is_pair <- function(vars = peek_vars(fn = "is_pair")) {
      vars[as.integer(str_sub(vars,2L,nchar(vars))) %% 2L == 0L]
    }
    df %>% rename_with(~paste0(.x,"_is_pair"),
                       is_pair())
    

    【讨论】:

      【解决方案2】:

      您可以使用reppaste -

      names(df)[-1] <- paste(rep(c('high', 'low'), each = 3), names(df)[-1], sep = '_')
      df
      
      #  X1 high_X2 high_X3 high_X4 low_X5 low_X6 low_X7
      #a  1       0       1       1      1      1      0
      #b  2       2       1       1      1      1      0
      

      如果您想依赖列范围,那么dplyr 代码会更容易。

      library(dplyr)
      df %>%
        rename_with(~paste('high', ., sep = '_'), X2:X4) %>%
        rename_with(~paste('low', ., sep = '_'), X5:X7)
      

      【讨论】:

      • 看起来是一个不错的解决方案,但我在这里只展示了我的数据框的一个片段,问题更复杂。如果该功能包括诸如此类的东西,那就太好了。从 X2 到 X4 而不是每个 =3
      • 也许使用rename_with 的更新答案更接近您的要求?
      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 2020-06-08
      • 2018-12-21
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多