R 重命名列名称范围内的变量
我有如下一些变量:R 重命名列名称范围内的变量,r,dplyr,rename,R,Dplyr,Rename,我有如下一些变量: 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_
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"
我想在中间和最后交换价值,例如
Q11_1_1->Q11_1_1
Q11_1_2->Q11_2_1
Q11_1_99->Q11_99_2
我可以这样做(但这相当耗时)
你知道怎么做吗?这里有两种不同的选择。第一种方法更紧凑,但第二种方法避免使用正则表达式。这两种方法中都没有使用包 1)sub像这样使用
sub
:
# 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
测试数据
DF可能的解决方案之一
colconvert <- function(a){
paste0(strsplit(a,"_",fixed = TRUE)[[1]][1],"_",strsplit(a,"_",fixed = TRUE)[[1]][3],"_",strsplit(a,"_",fixed = TRUE)[[1]][2])
}
names(samp) <- lapply(names(samp), colconvert)
我能想到的最快的方法是结合使用
strsplit
和paste
:
colnames(samp) <- as.vector(sapply(colnames(samp), function(x){ splitted <- unlist(strsplit(x,"_")) ; paste(splitted[1],splitted[3],splitted[2],sep="_") }))
colnames(samp)您可以使用拆分顺序粘贴方法
colnames(samp) <-
mapply(function(x) paste(x[c(1, 3:2)], collapse="_"), strsplit(colnames(samp), "_"))
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"
# [9] "Q11_1_9" "Q11_1_10" "Q11_1_11" "Q11_1_12" "Q11_1_99" "Q11_2_1" "Q11_2_2" "Q11_2_3"
# [17] "Q11_2_4" "Q11_2_5" "Q11_2_6" "Q11_2_7" "Q11_2_8" "Q11_2_9" "Q11_2_10" "Q11_2_11"
# [25] "Q11_2_12" "Q11_2_99"
colnames(samp)使用stringr
:
library(stringr)
# test data
df <- data.frame("Q11_1_1" = 1, "Q11_1_2" = 32, "Q11_1_3" = 3, "Q11_1_99" =
4)
ColNames = colnames(df)
# initialise an empty vector to hold new column names
new_ColNames = vector()
for (i in 1:length(ColNames)) {
splited = str_split(ColNames[i], "_")
new_ColNames[i] = paste(splited[[1]][1],splited[[1]][3],splited[[1]][2],
sep = "_")
}
# assign new colmun names to the df
colnames(df) = new_ColNames
您可以在这里找到regex
模式:(它是用于notepad++,但regex是相同的)。
[[1]]
[1] "Q11_1_1"
[[2]]
[1] "Q11_2_1"
[[3]]
[1] "Q11_3_1"
[[4]]
[1] "Q11_4_1"
[[5]]
[1] "Q11_5_1"
colnames(samp) <- as.vector(sapply(colnames(samp), function(x){ splitted <- unlist(strsplit(x,"_")) ; paste(splitted[1],splitted[3],splitted[2],sep="_") }))
colnames(samp) <-
mapply(function(x) paste(x[c(1, 3:2)], collapse="_"), strsplit(colnames(samp), "_"))
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"
# [9] "Q11_1_9" "Q11_1_10" "Q11_1_11" "Q11_1_12" "Q11_1_99" "Q11_2_1" "Q11_2_2" "Q11_2_3"
# [17] "Q11_2_4" "Q11_2_5" "Q11_2_6" "Q11_2_7" "Q11_2_8" "Q11_2_9" "Q11_2_10" "Q11_2_11"
# [25] "Q11_2_12" "Q11_2_99"
samp <- structure(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Dim = c(1L,
26L), .Dimnames = list(NULL, c("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", "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", "Q11_2_8",
"Q11_2_9", "Q11_2_10", "Q11_2_11", "Q11_2_12", "Q11_2_99")))
library(stringr)
# test data
df <- data.frame("Q11_1_1" = 1, "Q11_1_2" = 32, "Q11_1_3" = 3, "Q11_1_99" =
4)
ColNames = colnames(df)
# initialise an empty vector to hold new column names
new_ColNames = vector()
for (i in 1:length(ColNames)) {
splited = str_split(ColNames[i], "_")
new_ColNames[i] = paste(splited[[1]][1],splited[[1]][3],splited[[1]][2],
sep = "_")
}
# assign new colmun names to the df
colnames(df) = new_ColNames
> df
Q11_1_1 Q11_2_1 Q11_3_1 Q11_99_1
1 1 32 3 4