แปลงค่าในคอลัมน์เป็นชื่อแถวในกรอบข้อมูลที่มีอยู่ใน R


108

ฉันต้องการแปลงค่าในคอลัมน์ของกรอบข้อมูลที่มีอยู่เป็นชื่อแถว เป็นไปได้ไหมที่จะทำสิ่งนี้โดยไม่ต้องส่งออก data frame แล้วนำเข้าใหม่ด้วยการrow.names =โทร?

ตัวอย่างเช่นฉันต้องการแปลง:

 > samp 
     names Var.1 Var.2 Var.3
 1     A     1     5     0
 2     B     2     4     1
 3     C     3     3     2
 4     D     4     2     3
 5     E     5     1     4

เข้าสู่:

> samp.with.rownames 
     Var.1 Var.2 Var.3
A     1     5     0
B     2     4     1
C     3     3     2
D     4     2     3
E     5     1     4

ขอบคุณ

คำตอบ:


135

สิ่งนี้ควรทำ:

samp2 <- samp[,-1]
rownames(samp2) <- samp[,1]

ดังนั้นในระยะสั้นไม่มีทางเลือกอื่นในการกำหนดใหม่

แก้ไข: การแก้ไขตัวเองสามารถทำได้ในสถานที่: กำหนดแอตทริบิวต์ rowname จากนั้นลบคอลัมน์:

R> df<-data.frame(a=letters[1:10], b=1:10, c=LETTERS[1:10])
R> rownames(df) <- df[,1]
R> df[,1] <- NULL
R> df
   b c
a  1 A
b  2 B
c  3 C
d  4 D
e  5 E
f  6 F
g  7 G
h  8 H
i  9 I
j 10 J
R> 

4
> rownames (df) <- df [, 1] ข้อผิดพลาดในrow.names<-.data.frame( *tmp*, value = value): ความยาว 'row.names' ไม่ถูกต้องนอกจากนี้: ข้อความเตือน: การตั้งชื่อแถวบน tibble ถูกเลิกใช้แล้ว
user3673

36

ในปี 2559 คุณสามารถใช้ไฟล์tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")

1
โดยเฉพาะอย่างยิ่งก็คือtibble::column_to_rownames
Ott Toomet

1
ฉันได้รับคำเตือน "การตั้งชื่อแถวบนปลายแหลมเลิกใช้งานแล้ว"
Quantum7

1
การสร้างภาพแบบ tibble ไม่แสดงชื่อแถวหากต้องการดูว่าคุณต้องไพพ์ไปที่ as.data.frame ()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo



5

ดูเหมือนว่า one-liner จะเรียบง่ายกว่าเดิม (ปัจจุบันใช้ R 3.5.3):

# generate original data.frame
df <- data.frame(a = letters[1:10], b = 1:10, c = LETTERS[1:10])
# use first column for row names
df <- data.frame(df, row.names = 1)

คอลัมน์ที่ใช้สำหรับชื่อแถวจะถูกลบออกโดยอัตโนมัติ

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