假设我有一个名称非常奇怪的数据集,我想修改/替换变量名称字符串的一部分,并添加一个逻辑序列。下面的代码工作得很好,因为它用“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 one和this 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)
更新
从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)
旧答案
你可以使用paste0与sub
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)
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |