Переименовать несколько столбцов по именам
Кто-то должен был просить об этом уже, но я не мог найти ответа. Скажем, у меня есть:
x = data.frame(q=1,w=2,e=3, ...and many many columns...)
Какой самый элегантный способ переименовать произвольное подмножество столбцов, положение которых я не обязательно знаю, в некоторые другие произвольные имена?
например. Скажем, я хочу переименовать "q"
и "e"
в "A"
и "B"
, что является самым элегантным кодом для этого?
Очевидно, я могу сделать цикл:
oldnames = c("q","e")
newnames = c("A","B")
for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]
Но мне интересно, есть ли лучший способ? Может быть, использовать некоторые из пакетов? (plyr::rename
и т.д.)
Ответы
Ответ 1
setnames
из пакета data.table
будет работать на data.frame
или data.table
s
library(data.table)
d <- data.frame(a=1:2,b=2:3,d=4:5)
setnames(d, old = c('a','d'), new = c('anew','dnew'))
d
# anew b dnew
# 1 1 2 4
# 2 2 3 5
Обратите внимание, что изменения производятся по ссылке, поэтому копирование (даже для data.frames!)
Ответ 2
С dplyr вы бы сделали:
library(dplyr)
df = data.frame(q = 1, w = 2, e = 3)
df %>% rename(A = q, B = e)
# A w B
#1 1 2 3
Или, если вы хотите использовать векторы, как предложено @Jelena-bioinf:
library(dplyr)
df = data.frame(q = 1, w = 2, e = 3)
oldnames = c("q","e")
newnames = c("A","B")
df %>% rename_at(vars(oldnames), ~ newnames)
# A w B
#1 1 2 3
Ответ 3
Еще одно решение для не слишком большого объема данных (построение на основе ответа @thelatemail):
x <- data.frame(q=1,w=2,e=3)
> x
q w e
1 1 2 3
colnames(x) <- c("A","w","B")
> x
A w B
1 1 2 3
В качестве альтернативы вы также можете использовать:
names(x) <- c("C","w","D")
> x
C w D
1 1 2 3
Кроме того, вы также можете переименовать подмножество имен столбцов:
names(x)[2:3] <- c("E","F")
> x
C E F
1 1 2 3
Ответ 4
Итак, я недавно столкнулся с этим сам, если вы не уверены, существуют ли столбцы и хотите только переименовать те, которые делают:
existing <- match(oldNames,names(x))
names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]
Ответ 5
Вот наиболее эффективный способ переименовать несколько столбцов, используя комбинацию purrr::set_names()
и нескольких операций stringr
.
library(tidyverse)
# Make a tibble with bad names
data <- tibble(
'Bad NameS 1' = letters[1:10],
'bAd NameS 2' = rnorm(10)
)
data
# A tibble: 10 x 2
'Bad NameS 1' 'bAd NameS 2'
<chr> <dbl>
1 a -0.840
2 b -1.56
3 c -0.625
4 d 0.506
5 e -1.52
6 f -0.212
7 g -1.50
8 h -1.53
9 i 0.420
10 j 0.957
# Use purrr::set_names() with annonymous function of stringr operations
data %>%
set_names(~ str_to_lower(.) %>%
str_replace_all(" ", "_") %>%
str_replace_all("bad", "good"))
# A tibble: 10 x 2
good_names_1 good_names_2
<chr> <dbl>
1 a -0.840
2 b -1.56
3 c -0.625
4 d 0.506
5 e -1.52
6 f -0.212
7 g -1.50
8 h -1.53
9 i 0.420
10 j 0.957
Ответ 6
Основываясь на @user3114046 Ответ:
x <- data.frame(q=1,w=2,e=3)
x
# q w e
#1 1 2 3
names(x)[match(oldnames,names(x))] <- newnames
x
# A w B
#1 1 2 3
Это не зависит от конкретного упорядочения столбцов в наборе данных x
.
Ответ 7
Это изменит все вхождения этих букв во всех именах:
names(x) <- gsub("q", "A", gsub("e", "B", names(x) ) )
Ответ 8
names(x)[names(x) %in% c("q","e")]<-c("A","B")
Ответ 9
Вы можете получить набор имен, сохранить его как список, а затем выполнить массовое переименование строки. Хорошим примером этого является переход длинного к широкому набору данных:
names(labWide)
Lab1 Lab10 Lab11 Lab12 Lab13 Lab14 Lab15 Lab16
1 35.75366 22.79493 30.32075 34.25637 30.66477 32.04059 24.46663 22.53063
nameVec <- names(labWide)
nameVec <- gsub("Lab","LabLat",nameVec)
names(labWide) <- nameVec
"LabLat1" "LabLat10" "LabLat11" "LabLat12" "LabLat13" "LabLat14""LabLat15" "LabLat16" "
Ответ 10
Очень много ответов, поэтому я просто написал функцию, чтобы вы могли копировать/вставлять.
rename <- function(x, old_names, new_names) {
stopifnot(length(old_names) == length(new_names))
# pull out the names that are actually in x
old_nms <- old_names[old_names %in% names(x)]
new_nms <- new_names[old_names %in% names(x)]
# call out the column names that don't exist
not_nms <- setdiff(old_names, old_nms)
if(length(not_nms) > 0) {
msg <- paste(paste(not_nms, collapse = ", "),
"are not columns in the dataframe, so won't be renamed.")
warning(msg)
}
# rename
names(x)[names(x) %in% old_nms] <- new_nms
x
}
x = data.frame(q = 1, w = 2, e = 3)
rename(x, c("q", "e"), c("Q", "E"))
Q w E
1 1 2 3
Ответ 11
Sidenote, если вы хотите объединить одну строку со всеми именами столбцов, вы можете просто использовать этот простой код.
colnames(df) <- paste("renamed_",colnames(df),sep="")
Ответ 12
Если таблица содержит два столбца с одинаковым именем, код выглядит так:
rename(df,newname=oldname.x,newname=oldname.y)
Ответ 13
Если одна строка данных содержит имена, которые вы хотите изменить для всех столбцов, вы можете сделать
names(data) <- data[row,]
Данный data
- ваш dataframe, а row
- номер строки, содержащий новые значения.
Затем вы можете удалить строку, содержащую имена, с помощью
data <- data[-row,]
Ответ 14
Это функция, которая вам нужна: затем просто передайте x в переименовании (X), и он переименует все отображаемые значения, и если его там нет, он не выдаст ошибку
rename <-function(x){
oldNames = c("a","b","c")
newNames = c("d","e","f")
existing <- match(oldNames,names(x))
names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]
return(x)
}
Ответ 15
Сначала преобразуйте данные в data.frame и присвойте имена col в порядке
имена (данные)
data1 <- data.frame(data)
имена столбцов (data1) <- c ("цемент", "blast_fur_slag", "fly_ash", "water", "superplast", "coarse_aggr", "fine_aggr", "age", "concrete_comp_strength")
имена (data1)