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