重命名一系列列名称中的变量

Ban*_*njo 2 r rename dplyr

我有一些像下面这样的变量:

colnames(samp)

 [1] "Q11_1_1"  "Q11_1_2"  "Q11_1_3"  "Q11_1_4"  "Q11_1_5"  "Q11_1_6"  "Q11_1_7"  "Q11_1_8"  "Q11_1_9"  "Q11_1_10"
[11] "Q11_1_11" "Q11_1_12" "Q11_1_99" "Q11_2_1"  "Q11_2_2"  "Q11_2_3"  "Q11_2_4"  "Q11_2_5"  "Q11_2_6"  "Q11_2_7" 
[21] "Q11_2_8"  "Q11_2_9"  "Q11_2_10" "Q11_2_11" "Q11_2_12" "Q11_2_99"
Run Code Online (Sandbox Code Playgroud)

我想在中间和结尾交换值,例如

Q11_1_1-> Q11_1_1

Q11_1_2-> Q11_2_1

...

Q11_1_99-> Q11_99_2

我可以这样做(但是这很耗时)。

samp %>% 
rename(Q11_1_2 = Q11_2_1) 
Run Code Online (Sandbox Code Playgroud)

任何想法如何做到这一点?

G. *_*eck 5

这是两种不同的选择。第一个更紧凑,但是第二个避免使用正则表达式。两者均未使用任何软件包。

1)subsub像这样使用:

# test data
DF <- data.frame("Q11_1_1" = 1, "Q11_1_2"  = 2, "Q11_1_3" = 3)

names(DF) <- sub("(\\d+)_(\\d+)$", "\\2_\\1", names(DF))

DF
##   Q11_1_1 Q11_2_1 Q11_3_1
## 1       1       2       3
Run Code Online (Sandbox Code Playgroud)

2)read.table 此替代方法更长,但不使用任何正则表达式。

# test data
DF <- data.frame("Q11_1_1" = 1, "Q11_1_2"  = 2, "Q11_1_3" = 3)

names(DF) <- with(read.table(text = names(DF), sep = "_"), paste(V1, V3, V2, sep="_"))

DF
##   Q11_1_1 Q11_2_1 Q11_3_1
## 1       1       2       3
Run Code Online (Sandbox Code Playgroud)

如果不是所有的列都是指定的形式,这将选择那些列,然后对其进行转换。在这种情况下,我们需要它们全部,因此不需要它,但是如果还有其他列,则可以使用它。

ix <- grep("_.*_", names(DF))  # 1:3
names(DF)[ix] <- 
with(read.table(text = names(DF)[ix], sep = "_"), paste(V1, V3, V2, sep="_"))
Run Code Online (Sandbox Code Playgroud)