【问题标题】:How to select specific columns and remove then add a character string to the end of them in r如何选择特定列并删除,然后在 r 中将字符串添加到它们的末尾
【发布时间】:2023-11-20 06:46:01
【问题描述】:

我有一个非常大的数据集,包含三波数据。我想标准化列名,以便波浪名称位于每个变量的末尾。我成功地做到了,但我正在寻找一种更简洁的方法来做到这一点。我的数据如下所示:

toy <- as.data.frame(cbind(c(sample(1:100, 5)),
                           c(sample(1:100, 5)),
                           c(sample(1:100, 5)),
                           c(sample(1:100, 5)),
                           c(sample(1:100, 5)),
                           c(sample(1:100, 5))))
colnames(toy) <- c(paste0(LETTERS[1:4], "w", c(1,1,2,2)))
colnames(toy)[c(5,6)] <- c(paste0("w3", LETTERS[5:6]))

所以输出是:

toy
  Aw1 Bw1 Cw2 Dw2 w3E w3F
1  49  23  66  20  34  76
2  50  75  69  21  47  41
3  88  61  19  77  45   7
4  79  94  48  19  61  23
5  83  17  79  35  14  21

我希望它是这样的,其中第三波的格式与其他两个波一样:

  Aw1 Bw1 Cw2 Dw2 Ew3 Fw3
1  49  23  66  20  34  76
2  50  75  69  21  47  41
3  88  61  19  77  45   7
4  79  94  48  19  61  23
5  83  17  79  35  14  21

这是我所做的有效的:

t1.toy <- toy %>% rename_at(vars(contains("w3")),
                  .funs = list(function(x) paste0(x, "temp")))
t2.toy <- t1.toy %>% rename_at(vars(contains("w3")),
                            .funs = list(function(x) gsub(x = x, 
                                                          pattern = "w3", 
                                                          replacement = "")))
t3.toy <- t2.toy %>% rename_at(vars(contains("temp")),
                               .funs = list(function(x) gsub(x = x, 
                                                             pattern = "temp", 
                                                             replacement = "w3")))

还有其他更快的方法吗?

【问题讨论】:

    标签: r string dplyr multiple-columns rename


    【解决方案1】:

    也许你可以使用下面的代码

    toy <- `names<-`(toy,gsub("(.*?\\d+)(.*)","\\2\\1",names(toy)))
    

    【讨论】:

    • @garsimpitoyable (.*?\\d+) 匹配字母后跟数字的情况,(.*) 指的是后面的字符。这里,(.*?\\d+)(.*) 对应于 \\1\\2。在gsub() 中,\\2\\1 表示我们将找到的模式与原始\\1\\2 进行交换
    【解决方案2】:

    也许我们需要作为一个群体来捕捉

    library(dplyr)
    library(stringr)
    toy %>% 
       rename_at(vars(contains('w3')), ~ str_replace(., '(.*\\d+)(.*)', "\\2\\1"))
    #  Aw1 Bw1 Cw2 Dw2 Ew3 Fw3
    #1  49  23  66  20  34  76
    #2  50  75  69  21  47  41
    #3  88  61  19  77  45   7
    #4  79  94  48  19  61  23
    #5  83  17  79  35  14  21
    

    或者如果这需要自动完成,我们可以使用rename_all

    toy %>%
        rename_all(~ str_replace(., "^([a-z]\\w+)([A-Z])$", "\\2\\1"))
    

    数据

    toy <- structure(list(Aw1 = c(49L, 50L, 88L, 79L, 83L), Bw1 = c(23L, 
    75L, 61L, 94L, 17L), Cw2 = c(66L, 69L, 19L, 48L, 79L), Dw2 = c(20L, 
    21L, 77L, 19L, 35L), w3E = c(34L, 47L, 45L, 61L, 14L), w3F = c(76L, 
    41L, 7L, 23L, 21L)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5"))
    

    【讨论】:

      【解决方案3】:

      你可以使用colnames:

      colnames(toy) <- gsub("^(w3)(.+)$", "\\2\\1", colnames(toy))
      

      toy 的输出

        Aw1 Bw1 Cw2 Dw2 Ew3 Fw3
      1  49  23  66  20  34  76
      2  50  75  69  21  47  41
      3  88  61  19  77  45   7
      4  79  94  48  19  61  23
      5  83  17  79  35  14  21
      
      

      【讨论】:

        最近更新 更多