将列中的值转换为R中现有数据框中的行名


108

我想将现有数据框的列中的值转换为行名。是否可以执行此操作而无需导出数据帧,然后通过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

谢谢

Answers:


135

应该这样做:

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

简而言之,重新分配别无选择。

编辑:更正自己,也可以就地完成:分配行名属性,然后删除列:

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'长度另外:警告消息:不建议在小标题上设置行名。
user3673

36

自2016年起,您还可以使用tidyverse

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

1
更具体地说,是tibble::column_to_rownames
Ott Toomet

1
我收到警告“不
建议

1
tibble可视化不显示行名,但是,要查看行名,您需要将其通过管道传递给as.data.frame()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo,

22

一行

> samp.with.rownames <- data.frame(samp[,-1], row.names=samp[,1])

11

您可以通过2条简单的语句执行此操作:

row.names(samp) <- samp$names
samp[1] <- NULL

在R 3.5.3中工作
TheSciGuy

5

看起来单线变得更加简单(当前使用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)

用于行名的列将自动删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.