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

Lui*_*uis 4 r dplyr

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

    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)))
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 6

我发现这更简洁,并将正则tidyverse表达式与stringr.

library(dplyr)
library(stringr)

ds %>%
  rename_all( ~ str_replace(., "nameverybig", paste0("var", seq_along(.))))
Run Code Online (Sandbox Code Playgroud)

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

  ds %>%
    rename_at(vars(starts_with("nameverybig")), 
              ~ str_replace(., "nameverybig", paste0("var", seq_along(.))))
Run Code Online (Sandbox Code Playgroud)


Ron*_*hah 5

更新

dplyr1.0.0 开始,您可以使用rename_with.

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

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

或按名称

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

两者都返回:

#   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
Run Code Online (Sandbox Code Playgroud)

旧答案

你可以使用paste0sub

ds %>% rename_all(~paste0("var", seq_along(.), sub("nameverybig_*", "_", .)))
Run Code Online (Sandbox Code Playgroud)

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

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