Подтвердить что ты не робот

Переименовать несколько столбцов по именам

Кто-то должен был просить об этом уже, но я не мог найти ответа. Скажем, у меня есть:

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 и т.д.)

4b9b3361

Ответ 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)