Thay đổi tên cột của khung dữ liệu


399

Tôi có một khung dữ liệu gọi là "newprice" (xem bên dưới) và tôi muốn thay đổi tên cột trong chương trình của mình trong R.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

Trong thực tế đây là những gì đang làm:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Tôi không đặt điều này trong một vòng lặp vì tôi muốn mỗi tên cột khác nhau như bạn thấy.

Khi tôi dán chương trình của mình vào bảng điều khiển R, đây là đầu ra mà nó mang lại cho tôi:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

Tôi đã thử sử dụng c()chức năng tương tự - ví dụ c("premium"), thay vì paste()chức năng, nhưng không có kết quả.

Ai đó có thể giúp tôi tìm ra điều này?


Nếu câu trả lời của Dirk hoạt động thì vấn đề là bạn đã làm việc với ma trận chứ không phải với khung dữ liệu. Bạn có thể kiểm tra điều này với một trong hai is.matrixhoặc str.
IRTFM

3
Xem câu trả lời này trên dplyr :: đổi tên stackoverflow.com/a/26146202/1831980
Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyễn

Lỗi của bạn không liên quan gì đến chất lượng mã của bạn. Bạn đang sử dụng biểu tượng sai. Cái này không được R nhận ra, hãy sử dụng "thay vào đó. Tôi biết chúng có thể trông giống nhau. Nhìn gần:". Đó là nó.
Edo

Câu trả lời:


594

Sử dụng colnames()chức năng:

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

Bạn cũng có thể tập hợp con:

R> colnames(X)[2] <- "superduper"

12
@Dirk Tại sao không sử dụng tên () thay vì colnames ()?
Antoine Lizée

4
Tuyệt quá! Bạn cũng có thể tập hợp nhiều cột cùng một lúc (hữu ích trên các khung dữ liệu lớn). colnames(X)[c(1,2)] <- c("good", "better")
metakermit

7
Hãy thử setnames()trong data.tablegói. Sử dụng một cái gì đó như setnames(DT,"b","B")hoặcsetnames(DT,c("a","E"),c("A","F"))
dwstu

Thật kỳ lạ, sau khi đặt tên cột của khung dữ liệu q1, cố gắng thay đổi khung dữ liệu bằng cách sử dụng dplyrnhư q1 <- q1 %>% mutate(rel_count = count / 482462)kết quả trong lỗi Error in mutate_impl(.data, dots) : unknown column 'days'(trong đó daysmột tên mới được đặt cho cột). Điều này thực sự bực bội.
David Tonhofer

176

Tôi sử dụng cái này:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

7
Cảm ơn bạn. Tôi nghĩ rằng điều này gây khó chịu với R: Tại sao việc thay đổi tên cột lại khó khăn đến vậy nếu bạn không muốn sử dụng số chỉ mục nhưng tên cũ :(
Arne

10
Phương pháp này có ưu điểm là bạn không phải lo lắng về vị trí của cột, miễn là bạn biết tên gốc của nó. Tôi nghĩ rằng đây là phương pháp ưa thích như bạn có thể - sau này - thực hiện thay đổi mã thay đổi vị trí của cột bạn muốn đổi tên.
Paulo S. Abreu

78

Lỗi là do "trích dẫn thông minh" (hoặc bất cứ điều gì họ gọi). Bài học ở đây là, "đừng viết mã của bạn trong một 'trình soạn thảo' chuyển đổi dấu ngoặc kép thành dấu ngoặc kép thông minh".

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

Ngoài ra, bạn không cần paste("premium")(cuộc gọi đến pastelà dư thừa) và nên đặt khoảng trống xung quanh <-để tránh nhầm lẫn (ví dụ x <- -10; if(x<-3) "hi" else "bye"; x).


51

Bạn đã thử chưa:

names(newprice)[1]<-"premium"

?


42

Cách mới được đề xuất để làm điều này là sử dụng setNameschức năng. Xem ?setNames. Vì điều này tạo ra một bản sao mới data.frame, hãy chắc chắn gán kết quả cho bản gốc data.frame, nếu đó là ý định của bạn.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Các phiên bản mới hơn của R sẽ đưa ra cảnh báo nếu bạn sử dụng colnamestheo một số cách được đề xuất bởi các câu trả lời trước đó.

Nếu đây là data.tablethay thế, bạn có thể sử dụng data.tablehàm setnames, có thể sửa đổi tên cột cụ thể hoặc tên cột đơn theo tham chiếu :

setnames(data_table, "old-name", "new-name")

2
nghĩ rằng nó đã được yêu cầu data.frame, không phải data.table
Helix123

35

Tôi đã có cùng một vấn đề và đoạn mã này đã giải quyết được cho tôi.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

Nói tóm lại, mã này thực hiện như sau:

names(data)nhìn vào tất cả các tên trong dataframe ( data)

[names(data) == oldVariableName]trích xuất tên biến ( oldVariableName) bạn muốn đổi tên và <- "newVariableName"gán tên biến mới.


Làm thế nào điều này sẽ làm việc nếu bạn có một vectơ với 3 oldVariableNames?
jiggunjer

Chính xác những gì tôi đang tìm kiếm -> 2 ngón tay cái lên !!
SilSur

19

Tương tự như những người khác:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Khá đơn giản và dễ sửa đổi.


10

thử:

names(newprice) <- c("premium", "change", "newprice")

10

Nếu bạn cần đổi tên không phải tất cả trừ nhiều cột cùng một lúc khi bạn chỉ biết tên cột cũ, bạn có thể sử dụng colnameshàm và %in%toán tử. Thí dụ:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Bây giờ bạn muốn thay đổi "xấu" và "tệ nhất" thành "tốt" và "tốt nhất". Bạn có thể dùng

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Kết quả này trong

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
Mã đó giả định thứ tự các tên cột của bạn bằng thứ tự của các phần chèn
Hillary Sanders

10

Sử dụng để thay đổi tên cột theo chức năng colname.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

Bạn chỉ có thể thực hiện chỉnh sửa bằng cách:

newprice <- edit(newprice)

và thay đổi tên cột bằng tay.


Không phải điều này chỉ làm việc cho các yếu tố vector và yếu tố? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
Vagabond

Nó hoạt động cho khung dữ liệu ít nhất. Đó là những gì tôi biết.
Baykal

7

Tên cột của tôi là như dưới đây

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Tôi muốn thay đổi tên cột của Class và Sex

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

Có một vài lựa chọn với dplyr::rename()dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

Ngoài ra còn có ba biến thể có phạm vi dplyr::rename(): dplyr::rename_all()cho tất cả các tên cột, dplyr::rename_if()cho các tên cột nhắm mục tiêu có điều kiện và dplyr::rename_at()cho các cột được chọn có tên. Ví dụ sau thay thế khoảng trắng và dấu chấm bằng dấu gạch dưới và chuyển đổi mọi thứ thành chữ thường:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() cũng có thể được sử dụng theo cách tương tự:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

Chỉ cần sửa và hơi mở rộng câu trả lời Scott Wilson.
Bạn cũng có thể sử dụng setnameschức năng của data.table trên data.frames.

Đừng mong đợi tăng tốc hoạt động nhưng bạn có thể mong đợi setnameshiệu quả hơn cho việc tiêu thụ bộ nhớ vì nó cập nhật tên cột theo tham chiếu. Điều này có thể được theo dõi với addresschức năng, xem bên dưới.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Vì vậy, nếu bạn đang đạt giới hạn bộ nhớ, bạn có thể cân nhắc sử dụng cái này thay thế.


3

Điều này có thể hữu ích:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

Trong trường hợp chúng ta có 2 datafram thì các công việc sau

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

Chúng tôi thay đổi tên của DF1 như sau

 colnames(DF1)<- colnames(DF2)
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.