Переименовать переменные в диапазоне имен столбцов - PullRequest
2 голосов
/ 01 октября 2019

У меня есть некоторые переменные, как показано ниже:

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

Я могу сделать это таким образом (но это довольно много времени).

samp %>% 
rename(Q11_1_2 = Q11_2_1) 

Есть идеи, как это сделать?

Ответы [ 5 ]

5 голосов
/ 01 октября 2019

Вот две разные альтернативы. Первый более компактен, но второй избегает регулярных выражений. Пакеты не используются ни в одном из них.

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

2) read.table Thisальтернатива длиннее, но не использует регулярных выражений.

# 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

Если не все столбцы имеют указанную форму, это выберет те, которые отсутствуют, и просто преобразует их. В этом случае мы хотим их всех, так что это не нужно, но если бы были другие столбцы, это можно было бы использовать.

ix <- grep("_.*_", names(DF))  # 1:3
names(DF)[ix] <- 
with(read.table(text = names(DF)[ix], sep = "_"), paste(V1, V3, V2, sep="_"))
2 голосов
/ 01 октября 2019

Одно из возможных решений.

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)

Вывод:

[[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"
0 голосов
/ 01 октября 2019

Использование 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

Вывод:

> df
  Q11_1_1 Q11_2_1 Q11_3_1 Q11_99_1
1       1      32       3        4
0 голосов
/ 01 октября 2019

Вы могли бы сделать подход разделения - порядка - вставки.

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")))
0 голосов
/ 01 октября 2019

Самый быстрый способ, которым я могу придумать, это сочетание strsplit и paste:

colnames(samp) <- as.vector(sapply(colnames(samp), function(x){ splitted <- unlist(strsplit(x,"_")) ; paste(splitted[1],splitted[3],splitted[2],sep="_") }))
...