【问题标题】:Rename variables in a range of column names重命名一系列列名中的变量
【发布时间】:2020-01-30 18:12:34
【问题描述】:

我有一些变量如下:

colnames(samp)

 [1] "Q11_1_1"  "Q11_1_2"  "Q11_1_3"  "Q11_1_4"  "Q11_1_5"  "Q11_1_6"  "Q11_1_7"  "Q11_1_8"  "Q11_1_9"  "Q11_1_10"
[11] "Q11_1_11" "Q11_1_12" "Q11_1_99" "Q11_2_1"  "Q11_2_2"  "Q11_2_3"  "Q11_2_4"  "Q11_2_5"  "Q11_2_6"  "Q11_2_7" 
[21] "Q11_2_8"  "Q11_2_9"  "Q11_2_10" "Q11_2_11" "Q11_2_12" "Q11_2_99"

我想交换中间和末尾的值,例如

Q11_1_1 -> Q11_1_1

Q11_1_2 -> Q11_2_1

...

Q11_1_99 -> Q11_99_2

我可以这样做(但这很耗时)。

samp %>% 
rename(Q11_1_2 = Q11_2_1) 

知道怎么做吗?

【问题讨论】:

标签: r dplyr rename


【解决方案1】:

这里有两种不同的选择。第一个更紧凑,但第二个避免了正则表达式。两者都没有使用任何包。

1) sub 像这样使用sub

# test data
DF <- data.frame("Q11_1_1" = 1, "Q11_1_2"  = 2, "Q11_1_3" = 3)

names(DF) <- sub("(\\d+)_(\\d+)$", "\\2_\\1", names(DF))

DF
##   Q11_1_1 Q11_2_1 Q11_3_1
## 1       1       2       3

2) read.table 这个替代方法更长,但不使用任何正则表达式。

# test data
DF <- data.frame("Q11_1_1" = 1, "Q11_1_2"  = 2, "Q11_1_3" = 3)

names(DF) <- with(read.table(text = names(DF), sep = "_"), paste(V1, V3, V2, sep="_"))

DF
##   Q11_1_1 Q11_2_1 Q11_3_1
## 1       1       2       3

如果不是所有的列都是指定的形式,这将挑选出那些列并只是转换它们。在这种情况下,我们想要它们全部,因此不需要它,但如果有其他列可以使用它。

ix <- grep("_.*_", names(DF))  # 1:3
names(DF)[ix] <- 
with(read.table(text = names(DF)[ix], sep = "_"), paste(V1, V3, V2, sep="_"))

【讨论】:

    【解决方案2】:

    使用stringr

    library(stringr)
    # test data
    df <- data.frame("Q11_1_1" = 1, "Q11_1_2"  = 32, "Q11_1_3" = 3, "Q11_1_99" = 
           4)
    ColNames = colnames(df)
    # initialise an empty vector to hold new column names
    new_ColNames = vector()
    for (i in 1:length(ColNames)) {
      splited = str_split(ColNames[i], "_")
      new_ColNames[i] = paste(splited[[1]][1],splited[[1]][3],splited[[1]][2], 
                              sep = "_")
    }
    # assign new colmun names to the df
    colnames(df) = new_ColNames
    

    输出:

    > df
      Q11_1_1 Q11_2_1 Q11_3_1 Q11_99_1
    1       1      32       3        4
    

    【讨论】:

      【解决方案3】:

      你可以做一个拆分 - 订单 - 粘贴的方法。

      colnames(samp) <- 
        mapply(function(x) paste(x[c(1, 3:2)], collapse="_"), strsplit(colnames(samp), "_"))
      
      colnames(samp)
      # [1] "Q11_1_1"  "Q11_1_2"  "Q11_1_3"  "Q11_1_4"  "Q11_1_5"  "Q11_1_6"  "Q11_1_7"  "Q11_1_8" 
      # [9] "Q11_1_9"  "Q11_1_10" "Q11_1_11" "Q11_1_12" "Q11_1_99" "Q11_2_1"  "Q11_2_2"  "Q11_2_3" 
      # [17] "Q11_2_4"  "Q11_2_5"  "Q11_2_6"  "Q11_2_7"  "Q11_2_8"  "Q11_2_9"  "Q11_2_10" "Q11_2_11"
      # [25] "Q11_2_12" "Q11_2_99"
      

      数据

      samp <- structure(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Dim = c(1L, 
      26L), .Dimnames = list(NULL, c("Q11_1_1", "Q11_1_2", "Q11_1_3", 
      "Q11_1_4", "Q11_1_5", "Q11_1_6", "Q11_1_7", "Q11_1_8", "Q11_1_9", 
      "Q11_1_10", "Q11_1_11", "Q11_1_12", "Q11_1_99", "Q11_2_1", "Q11_2_2", 
      "Q11_2_3", "Q11_2_4", "Q11_2_5", "Q11_2_6", "Q11_2_7", "Q11_2_8", 
      "Q11_2_9", "Q11_2_10", "Q11_2_11", "Q11_2_12", "Q11_2_99")))
      

      【讨论】:

        【解决方案4】:

        我能想到的最快方法是strsplitpaste 的组合:

        colnames(samp) <- as.vector(sapply(colnames(samp), function(x){ splitted <- unlist(strsplit(x,"_")) ; paste(splitted[1],splitted[3],splitted[2],sep="_") }))
        

        【讨论】:

          【解决方案5】:

          可能的解决方案之一。

          colconvert <- function(a){
              paste0(strsplit(a,"_",fixed = TRUE)[[1]][1],"_",strsplit(a,"_",fixed = TRUE)[[1]][3],"_",strsplit(a,"_",fixed = TRUE)[[1]][2])
          }
          
          names(samp) <- lapply(names(samp), colconvert)
          

          输出:

          [[1]]
          [1] "Q11_1_1"
          
          [[2]]
          [1] "Q11_2_1"
          
          [[3]]
          [1] "Q11_3_1"
          
          [[4]]
          [1] "Q11_4_1"
          
          [[5]]
          [1] "Q11_5_1"
          

          【讨论】:

            猜你喜欢
            • 2017-10-23
            • 2021-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多