แปลงชื่อแถวเป็นคอลัมน์แรก


154

ฉันมีกรอบข้อมูลดังนี้:

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" 

ฉันต้องการแปลงชื่อแถวเป็นคอลัมน์แรก ปัจจุบันฉันใช้สิ่งนี้เพื่อสร้างชื่อแถวเป็นคอลัมน์แรก:

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

มีบรรทัดเดียวทำเช่นนี้หรือไม่?



12
คุณไม่ต้องการแพ็คเกจเพิ่มเติมนี่คือซับd <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r

ความคิดเห็นโดย @ ssp3nc3r ควรเป็นคำตอบที่ยอมรับได้
Hrant

คำตอบ:


123

คุณสามารถทั้งชื่อแถวลบและแปลงให้เป็นคอลัมน์โดยการอ้างอิง (ไม่จัดสรรหน่วยความจำที่ใช้->) โดยใช้setDTและkeep.rownames = TRUEข้อโต้แย้งจากdata.tableแพคเกจ

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

ตามที่ @snoram กล่าวไว้คุณสามารถตั้งชื่อคอลัมน์ใหม่ได้ตามต้องการเช่นsetDT(df, keep.rownames = "newname")เพิ่ม "newname" เป็นคอลัมน์แถว


5
ใช้colnames(df)[1] <- "newname"เพื่อเปลี่ยนชื่อคอลัมน์แรกหากจำเป็น
Swetabh

5
@Swetabh ดีไม่มี. setnames(df, 1, "newname")เป็นdata.tableวิธีการ
David Arenburg

@DavidArenburg อืม (อย่างน้อย) ตอนนี้คุณสามารถทำได้ในการโทรเดียวกันsetDT(df, keep.rownames = "newname")[]
sindri_baldur

1
@DavidArenburg พบในเอกสารสำหรับas.data.table(): หากเป็น TRUE ให้เพิ่มชื่อวัตถุอินพุตเป็นคอลัมน์แยกชื่อ "rn" keep.rownames = "id" ตั้งชื่อคอลัมน์ "id" แทน
sindri_baldur

1
@snoram พบดีฉันจะทำการประชาสัมพันธ์เพื่อให้เอกสารสอดคล้องกัน
David Arenburg

146

หรือคุณสามารถใช้dplyr's add_rownamesซึ่งจะเป็นสิ่งเดียวกันเป็นคำตอบของดาวิด:

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

อัปเดต (กลางปี ​​2559): (รวมไว้ข้างต้น)

ฟังก์ชันเก่าที่เรียกว่าadd_rownames()ได้เลิกใช้งานแล้วและกำลังถูกแทนที่ด้วยtibble::rownames_to_column()(ฟังก์ชันเดียวกัน แต่ Hadley ปรับโครงสร้างdplyrเล็กน้อย)


14
ไม่เหมือนกันทุก
ประการ

1
อัปเดต: การอัปเดต dplyr จำเป็นต้องใช้ tibble :: rownames_to_column () เนื่องจาก dplyr :: rownames ถูกเลิกใช้
EDennnis

นี่เป็นสิ่งที่ดีถ้าใครต้องการอยู่ใน tidyverse
Euler_Salter

86

ตัวเลือกหนึ่งบรรทัดคือ:

df$names <- rownames(df)

16
ฉันหวังว่าคุณจะตระหนักถึงความจริงที่ว่ามันเพิ่มrownamesเป็นคอลัมน์สุดท้ายไม่ใช่คอลัมน์แรก
Agaz Wani

31

หรือคุณสามารถสร้างดาต้าเฟรมใหม่ (หรือเขียนทับดาต้าเฟรมปัจจุบันดังตัวอย่างด้านล่าง) เพื่อที่คุณจะได้ไม่ต้องใช้แพ็กเกจภายนอกใด ๆ อย่างไรก็ตามวิธีนี้อาจไม่ได้ผลกับดาต้าเฟรมขนาดใหญ่

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

10
หรือ:df <- cbind(names = rownames(df), df)
Mark Miller

16

ย้ายความคิดเห็นของฉันไปเป็นคำตอบตามข้อเสนอแนะด้านบน:

คุณไม่ต้องการแพ็คเกจเพิ่มเติมนี่คือซับเดียว:

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

4

dplyr::as_data_frame(df, rownames = "your_row_name") จะให้ผลลัพธ์ที่ง่ายยิ่งขึ้น


2
@HectorHaffenden ได้แก้ไขสิ่งนี้สำหรับโปสเตอร์เพราะเป็นคำแนะนำที่ดีจริงๆ
Tjebo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.