Chuyển đổi tên hàng thành cột đầu tiên


146

Tôi có một khung dữ liệu như thế này:

df
              VALUE              ABS_CALL DETECTION P-VALUE    
    1007_s_at "957.729231881542" "P"      "0.00486279317241156"
    1053_at   "320.632701283368" "P"      "0.0313356324173416" 
    117_at    "429.842323161046" "P"      "0.0170004527476119" 
    121_at    "2395.7364289242"  "P"      "0.0114473584876183" 
    1255_g_at "116.493632746934" "A"      "0.39799368200131"   
    1294_at   "739.927122116896" "A"      "0.0668649772942343" 

Tôi muốn chuyển đổi tên hàng thành cột đầu tiên. Hiện tại tôi sử dụng một cái gì đó như thế này để đặt tên hàng làm cột đầu tiên:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)

Có một dòng duy nhất để làm điều này?



12
Bạn không cần các gói bổ sung, đây là một gói:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r

Nhận xét của @ ssp3nc3r phải là một câu trả lời được chấp nhận
Hrant

Câu trả lời:


119

Bạn có thể xóa cả tên hàng và chuyển đổi chúng thành một cột bằng cách tham chiếu (không cần phân bổ lại bộ nhớ bằng cách sử dụng ->) setDTkeep.rownames = TRUEđối số của nó từ data.tablegói

library(data.table)
setDT(df, keep.rownames = TRUE)[]
#    rn     VALUE  ABS_CALL DETECTION     P.VALUE
# 1:  1 1007_s_at  957.7292         P 0.004862793
# 2:  2   1053_at  320.6327         P 0.031335632
# 3:  3    117_at  429.8423         P 0.017000453
# 4:  4    121_at 2395.7364         P 0.011447358
# 5:  5 1255_g_at  116.4936         A 0.397993682
# 6:  6   1294_at  739.9271         A 0.066864977

Như được đề cập bởi @snoram, bạn có thể đặt cho cột mới bất kỳ tên nào bạn muốn, ví dụ: setDT(df, keep.rownames = "newname")sẽ thêm "newname" làm cột hàng.


5
Sử dụng colnames(df)[1] <- "newname"để đổi tên cột đầu tiên nếu cần.
Swetabh

5
@Swetabh Vâng, không. setnames(df, 1, "newname")data.tablecách
David Arenburg

@DavidArenburg Chà, (ít nhất) bây giờ bạn có thể thực hiện nó trong cùng một cuộc gọisetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg được tìm thấy trong tài liệu cho as.data.table(): Nếu TRUE, thêm tên của đối tượng đầu vào dưới dạng một cột riêng có tên "rn". keep.rownames = "id" đặt tên cho cột là "id"
sindri_baldur

1
@snoram tìm thấy tốt, tôi sẽ thực hiện một PR liên quan đến điều đó để làm cho tài liệu nhất quán.
David Arenburg

140

Hoặc bạn có thể sử dụng dplyr's add_rownamesmà làm điều tương tự như câu trả lời của David:

library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")

CẬP NHẬT (giữa năm 2016): (kết hợp với những điều trên)

Hàm cũ được gọi là add_rownames()không dùng nữa và đang được thay thế bằng tibble::rownames_to_column()(cùng hàm, nhưng Hadley đã cấu trúc lại dplyrmột chút).


14
Không hoàn toàn giống nhau, bởi vì nó không làm điều đó bằng cách tham khảo :)
David Arenburg

1
CẬP NHẬT: cập nhật dplyr yêu cầu một người sử dụng tibble :: rownames_to_column () vì dplyr :: rownames không được dùng nữa.
EDennni

Điều này thật tuyệt nếu một người muốn ở trong phạm vi gọn gàng
Euler_Salter

83

Tùy chọn một dòng là:

df$names <- rownames(df)

12
Tôi hy vọng bạn nhận thức được thực tế rằng nó thêm vào rownamesnhư một cột cuối cùng, thực sự không phải là một cột đầu tiên.
Agaz Hussain

30

Ngoài ra, bạn có thể tạo một khung dữ liệu mới (hoặc ghi đè lên khung hiện tại, như ví dụ bên dưới) để bạn không cần sử dụng bất kỳ gói bên ngoài nào. Tuy nhiên cách này có thể không hiệu quả với các datafram lớn.

df <- data.frame(names = row.names(df), df)

10
Hoặc:df <- cbind(names = rownames(df), df)
Mark Miller

15

Chuyển nhận xét của tôi thành câu trả lời cho mỗi đề xuất ở trên:

Bạn không cần các gói bổ sung, đây là một gói:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))

4

dplyr::as_data_frame(df, rownames = "your_row_name") sẽ cung cấp cho bạn kết quả thậm chí đơn giản hơn.


2
@HectorHaffenden đã chỉnh sửa điều này cho poster, bởi vì đây thực sự là một gợi ý hay.
Tjebo

2

Hoặc bằng cách sử dụng DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
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.