重命名包含特定字符串的所有变量,并添加顺序号

时间:2019-08-22 13:01:49

标签: r dplyr

比方说,我有一个名称很奇怪的数据集,我想修改/替换变量名称字符串的一部分,并添加一个逻辑序列。下面的代码效果很好,因为它将“ 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 这篇文章有可复制的代码。如果需要提高问题的质量,请告诉我。 谢谢。

3 个答案:

答案 0 :(得分:4)

您可以将library(dplyr) ds %>% rename_all(~paste0("var", seq_along(.), sub("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 rename_at一起使用

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

仅重命名特定变量,我们可以使用{{1}}

{{1}}

答案 1 :(得分:2)

带有setNames的选项:

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

或者按照@Adam的建议,可以使用purrr / rlang的{​​{1}}:

set_names

结果:

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

答案 2 :(得分:2)

我发现这更加简洁,将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(.))))