【问题标题】:Rename all variables that contai a particular string and add a sequencial number重命名包含特定字符串的所有变量并添加序号
【发布时间】:2019-12-27 19:34:35
【问题描述】:

假设我有一个名称非常奇怪的数据集,我想修改/替换变量名称字符串的一部分,并添加一个逻辑序列。下面的代码运行良好,因为它将“nameverybig”替换为“var”。

    library(tidyverse)
ds <- data.frame(identification = 1:10,
                 nameverybig_do_you_like_cookies = c(1:10), 
                 nameverybig_have_you_been_in_europe = c(1:10),
                 nameverybig_whats_your_gender = c(1:10))


    ds <- ds %>% 
      rename_all(.,~sub("nameverybig_*", 
                        paste("var"),
                        names(ds)))

但我在重命名字符串和添加逻辑序列的过程中苦苦挣扎。

ds %>% names
dados <- ds %>% 
  rename_all(.,~sub("nameverybig_*", 
                    paste("var", 1:3),
                    names(ds)))

我想留在 tidyverse 框架内。我试过rename_all + contains 和匹配,还有rename_at,但没有成功。我将此代码基于其他帖子,例如this onethis one 这篇文章有一个可重现的代码。如果我需要提高问题的质量,请告诉我。 谢谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    更新

    dplyr 1.0.0 你可以使用rename_with

    您可以按位置选择要重命名的列

    library(dplyr)
    ds %>% rename_with(~paste0("var", seq_along(.), sub("nameverybig_*", "_", .)), -1)
    

    或按名称

    ds %>% rename_with(~paste0("var", seq_along(.), sub("nameverybig_*", "_", .)), 
                       starts_with('nameverybig'))
    

    两者都返回:

    #   identification var1_do_you_like_cookies var2_have_you_been_in_europe var3_whats_your_gender
    #1               1                        1                            1                      1
    #2               2                        2                            2                      2
    #3               3                        3                            3                      3
    #4               4                        4                            4                      4
    #5               5                        5                            5                      5
    #6               6                        6                            6                      6
    #7               7                        7                            7                      7
    #8               8                        8                            8                      8
    #9               9                        9                            9                      9
    #10             10                       10                           10                     10
    

    旧答案

    您可以将paste0sub 一起使用

    ds %>% rename_all(~paste0("var", seq_along(.), sub("nameverybig_*", "_", .)))
    

    要重命名特定变量,我们可以使用rename_at

    ds %>% rename_at(vars(starts_with("nameverybig")), 
          ~paste0("var", seq_along(.), sub("nameverybig_*", "_", .)))
    

    【讨论】:

    • 很好奇,你怎么能把这个结果粘贴到这里?就像把这张表放在答案中
    • @NelsonGon 对不起,我没听明白。你是指表的名称还是数据?
    • 我只是指表,将其从 IDE 复制到 SO。我试过了,但有些数据转到下一行。经常发生。
    • 嘿,@RonakShah,你的脚本近乎完美,但如果之前替换了包括“var”在内的所有名称。对不起这是我的错!我已经更新了我的原始代码以使我的问题更清楚。您能否指出如何仅更改具有“nameverybig”的变量,保留数据集中的所有其他变量?
    • @NelsonGon 我猜你需要在 IDE 中调整控制台的宽度。
    【解决方案2】:

    setNames 的选项:

        ds %>% 
          setNames(nm=paste0("var",1:ncol(.),
                             gsub("nameverybig+",
                           "",
                           names(.))))
    

    或者按照@Adam 的建议,可以使用purrr/rlang's set_names

    ds %>%
      purrr::set_names(~paste0("var",seq_along(.),
                               gsub("nameverybig+",
                                    "",.)))
    

    结果:

     var1_do_you_like_cookies var2_have_you_been_in_europe   var3_whats_your_gender
    1                         1                            1                      1
    2                         2                            2                      2
    3                         3                            3                      3
    4                         4                            4                      4
    5                         5                            5                      5
    6                         6                            6                      6
    7                         7                            7                      7
    8                         8                            8                      8
    9                         9                            9                      9
    10                       10                           10                     10  
    

    【讨论】:

    • 如果你这样做,还考虑从rlang 中的set_names()(导出到purrr)。它可以支持公式符号和其他一些好东西。
    • 谢谢,我已经添加了这个选项,尽管它与rename_all 提供的其他选项几乎相同。
    • 你好,@Adam,学习如何处理 purrr 是我的下一个目标。 =D
    【解决方案3】:

    我觉得这更简洁一些,并使用 tidyverse 正则表达式和 stringr

    library(dplyr)
    library(stringr)
    
    ds %>%
      rename_all( ~ str_replace(., "nameverybig", paste0("var", seq_along(.))))
    

    如果“nameverybig”变量只是一个子集,我会将其与 Ronak Shah 的答案结合起来。

      ds %>%
        rename_at(vars(starts_with("nameverybig")), 
                  ~ str_replace(., "nameverybig", paste0("var", seq_along(.))))
    

    【讨论】:

    • 不错的代码,谢谢。实际上,因为数据集在“目标”变量之前有要重命名的变量,所以替换以“var2”、“var3”等开头。我看到它是因为 seq_along 而发生的。有可能改变吗?
    • 是的,我基本上只是将它与另一个答案结合起来,并使用rename_atstr_replace
    猜你喜欢
    • 2022-07-19
    • 2018-12-25
    • 2021-09-07
    • 2022-09-28
    • 2014-04-12
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多