Làm cách nào để đổi tên một cột trong data.frame?


335

Tôi biết nếu tôi có khung dữ liệu có nhiều hơn 1 cột, tôi có thể sử dụng

colnames(x) <- c("col1","col2")

để đổi tên các cột. Làm thế nào để tôi làm điều này nếu nó chỉ là một cột? Có nghĩa là một vectơ hoặc khung dữ liệu chỉ có một cột trong đó.

Thí dụ:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
Giải pháp của @ aix sẽ hoạt động cho data.frame 1 cột. Bạn có thể bị nhầm lẫn bởi drop=TRUEđối số mặc định [, điều này khiến đối tượng "1 cột" được chuyển đổi thành vectơ ... và vectơ không có colnames. Một ví dụ về những gì bạn đã cố gắng sẽ rất hữu ích.
Joshua Ulrich

2
nó hoạt động nếu bạn sử dụng "colnames (x) [1] <- 'newname2'"
screechOwl

Câu trả lời:


343
colnames(trSamp)[2] <- "newname2"

cố gắng đặt tên của cột thứ hai. Đối tượng của bạn chỉ có một cột, vì vậy lệnh sẽ xuất hiện một lỗi. Điều này là đủ:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Điều này dường như không hoạt động nếu tên cột giống như "A,B,C,X,Y,Z"nơi tôi muốn đổi tên thành Ysử dụng testData[379] <- "Y".
Chetan Arvind Patil

575

Đây là một cách tổng quát mà bạn không cần phải nhớ chính xác vị trí của biến:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Mã này khá nhiều như sau:

  1. names(df) nhìn vào tất cả các tên trong df
  2. [names(df) == old.var.name] trích xuất tên biến bạn muốn kiểm tra
  3. <- 'new.var.name' gán tên biến mới.

5
Tôi cũng khá mới với R, yêu thích giải pháp này! Tôi thực sự đã kiểm tra những gì nó làm và tôi nghĩ rằng nó đáng để xác định rằng [names(df) == old.var.name]thực sự trả về một vectơ với các giá trị đúng / sai. Vì vậy, nó có khả năng thay đổi nhiều tên cột nếu, ví dụ, các biểu thức thông thường được sử dụng.
mikyatope

3
Đối với kết quả biểu thức chính quy, sử dụng một cái gì đó như names(df) = sub('pattern', 'replacement', names(df)). Nếu không, bạn sẽ cố gắng đặt nhiều cột thành cùng một tên.
Chúng tôi là tất cả Monica

40
Cảm xúc lẫn lộn ... trong một thế giới hoàn hảo, nơi có rất nhiều ngôn ngữ lập trình hoàn hảo, liệu nó có thực sự đòi hỏi nhiều tổ hợp phím này để thay đổi tên của một cột không? Tôi yêu R nhưng đôi khi tôi muốn bóp nghẹt nó vì những lý do này.
tumultous_rooster

4
Làm thế nào không có chức năng bao bọc cho điều này trong cơ sở?
ifly6

1
Làm thế nào tất cả chúng ta mong muốn! Bây giờ tôi không biết, nhưng hồi đó không có bất kỳ trình bao bọc nào trong cơ sở
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
Tôi thích giải pháp này vì bạn có thể tham chiếu tên cột theo tên, trái với yêu cầu phải biết đó là cột số nào. Tốt hơn cho các tính năng số lượng lớn hơn.
Từ trường

1
Tôi đã có một phần mở rộng nhỏ cho câu hỏi và câu trả lời này. Tôi có một khung dữ liệu với một cột có các chữ cái 'snp' trong đó. Tôi muốn đổi tên nó thành 'Marker' . Nhưng tôi muốn sử dụng một biểu thức thông thường để làm như vậy. Rõ ràng mã tôi có thiếu sót : colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker", vì cột không được đổi tên. Nếu tôi làm names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"được đổi tên. Tôi đang thiếu gì?
Sander W. van der Laan

76

Đây là một câu hỏi cũ, nhưng điều đáng chú ý là bây giờ bạn có thể sử dụng setnamestừ data.tablegói.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
hoặc setNamestừ căn cứ R.
PatrickT

53

Điều này cũng có thể được thực hiện bằng cách sử dụng plyrgói của Hadley và renamechức năng.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

Bạn có thể đổi tên theo tên (mà không biết vị trí) và thực hiện nhiều lần đổi tên cùng một lúc. Sau khi thực hiện hợp nhất, chẳng hạn, bạn có thể kết thúc bằng:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Mà sau đó bạn có thể đổi tên trong một bước bằng cách sử dụng:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renamebây giờ là một chức năng trong dplyrgói.
Sam Firke

36

Tôi nghĩ cách tốt nhất để đổi tên cột là sử dụng gói dplyr như thế này:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Nó hoạt động tương tự để đổi tên một hoặc nhiều cột trong bất kỳ tập dữ liệu nào.


12

Tôi thích kiểu tiếp theo để đổi tên từng cột cột dữ liệu.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

Ở đâu

which(colnames(df) == 'old_colname')

trả về theo chỉ số của cột cụ thể.


1
+1 để cung cấp cho người dùng cơ hội sử dụng tên cũ thực tế :)

1
Sự khác biệt ở đây so với giải pháp của @zongshiwujie là gì?
buhtz

which()không cần thiết.
sindri_baldur

12

Tôi thấy rằng cách thuận tiện nhất để đổi tên một cột là sử dụng dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • hoạt động tốt trong chuỗi ống
  • thuận tiện khi tên được lưu trữ trong các biến
  • làm việc với một tên hoặc một chỉ mục cột
  • rõ ràng và nhỏ gọn

6

Bạn có thể sử dụng rename.varstrong gdatagói.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Điều này đặc biệt hữu ích khi bạn có nhiều hơn một tên biến để thay đổi hoặc bạn muốn nối thêm hoặc chuyển trước một số văn bản sang tên biến, sau đó bạn có thể làm một cái gì đó như:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Để biết ví dụ về việc thêm văn bản vào tập hợp con của các tên biến, hãy xem: https://stackoverflow.com/a/28870000/180892


Đây là cách dễ nhất, cảm ơn. Có vấn đề với gói dplyr.
DanielB

4

Thử:

colnames(x)[2] <- 'newname2'

8
Đây là những gì đã ném lỗi mà OP đã hỏi về (trong bản chỉnh sửa của mình). Nó sẽ không hoạt động, vì khung dữ liệu chỉ có một cột.

. @ NPE - Điều này dường như không hoạt động nếu tên cột giống như "A,B,C,X,Y,Z"nơi tôi muốn đổi tên thành Ysử dụng testData[379] <- "Y".
Chetan Arvind Patil

4

Điều này có khả năng đã ở ngoài đó, nhưng tôi đã chơi với việc đổi tên các trường trong khi tìm kiếm một giải pháp và thử nó một cách bất chợt. Làm việc cho mục đích của tôi.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

Chỉnh sửa bắt đầu từ đây ....

Điều này làm việc như là tốt.

df <- rename(df, c("oldColName" = "newColName"))

Đối với bất cứ ai đánh dấu tôi, điều đó là tốt, nhưng vì tôi rõ ràng là người mới làm điều này, có lẽ bạn có thể ngộ ra những gì sai với câu trả lời.
Scottieie

Không có gì sai với câu trả lời của bạn, ngoài việc nó không phải là một oneliner .. đó chỉ là một người dùng SO thù địch không đủ can đảm để biện minh cho cơn giận dữ của mình.
đếm0

Cảm ơn @ đếm0. Nó thực sự có ý nghĩa khi có một số điểm mana hoặc bất cứ điều gì để nhận xét về một câu hỏi, điều mà tôi vẫn chưa thể làm được. Theo dõi các câu hỏi trong một số trường hợp sẽ tốt khi tôi học một kỹ năng mới. Lần nữa. TY.
Scottieie

1
chúng ta cần cung cấp cho tất cả các tên cột để sử dụng này.
Arpit Sisodia

renameChức năng này đến từ gói nào ?
Diego

3

Nếu bạn biết rằng khung dữ liệu của bạn chỉ có một cột, bạn có thể sử dụng: names(trSamp) <- "newname2"


3

Bạn cũng có thể thử 'upData' từ gói 'H'misc'.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


Rất đẹp! Nó cũng có thể đổi tên nhiều cột cùng một lúc: trSamp = upData (. TrSamp, đổi tên = c (sample.trainer.index..10000 = 'newname2, AnotherColumnName = 'RenameThisColumn'))
FraNut

0

Câu hỏi của OP đã được trả lời tốt và thực sự. Tuy nhiên, đây là một mẹo có thể hữu ích trong một số trường hợp: khớp một phần tên cột, không phân biệt vị trí của nó trong khung dữ liệu:

Kết hợp một phần trên tên:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Một ví dụ khác: khớp một phần với sự hiện diện của "dấu câu":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Đây là những ví dụ tôi phải đối phó với ngày hôm nay, tôi nghĩ có thể đáng để chia sẻ.



0

Chúng ta có thể sử dụng rename_withđể đổi tên các cột bằng một hàm ( stringrví dụ: các hàm).

Hãy xem xét các dữ liệu sau df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Đổi tên tất cả các biến bằng dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Đổi tên bằng hạt tên với một số dplyrđộng từ ( starts_with, ends_with, contains, matches, ...).

Ví dụ với .( xbiến):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Đổi tên của lớp với nhiều chức năng của kiểm tra lớp, giống như is.integer, is.numeric, is.factor...

Ví dụ với is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

Cảnh báo:

Thông báo cảnh báo: 1: Trong stri numplace_first_regex (chuỗi, mẫu, fix numplocation (thay thế) ,: chiều dài đối tượng dài hơn không phải là bội số của đối tượng ngắn hơn 2: Trong tên [cols] <- .fn (tên [cols], ...) : số lượng vật phẩm cần thay thế không phải là bội số của chiều dài thay thế

Nó không liên quan, vì nó chỉ là sự không nhất quán seq_along(.)với chức năng thay thế.


-1

Tôi chỉ cần thêm một cột mới vào khung dữ liệu với tên tôi muốn và lấy dữ liệu cho nó từ cột hiện có. như thế này:

dataf$value=dataf$Article1Order

sau đó tôi xóa cột cũ! như thế này:

dataf$Article1Order<-NULL

Mã này có vẻ ngớ ngẩn! Nhưng nó hoạt động hoàn hảo ...


-1

Tôi chỉ đơn giản là thay đổi tên cột thành tập dữ liệu với tên mới tôi muốn với mã sau: tên (tập dữ liệu) [index_value] <- "new_col_name"


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.