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

我希望将现有数据框架的列中的值转换为行名。是否可以不导出数据帧,然后通过 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
303510 次浏览

这应该可以:

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

所以简而言之,除了重新分配,别无选择。

编辑: 更正我自己,一个人也可以在适当的地方做: 分配 rowname 属性,然后删除 column:

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>

排成一行

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

从2016年开始,你也可以使用 tidyverse

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

您可以用两个简单的语句来执行:

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

看起来一行程序变得更简单了(目前使用的是 R3.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)

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

只有一行数据框

注意,如果数据框架只有一行,那么行为可能会让人感到困惑:

如果提供的行名长度为1,并且数据框架只有一行,那么 row.name 将用于指定行名,而不是列(按名称或数字)。

这意味着,如果您使用与上面相同的命令,它可能看起来像什么也没做(当它实际上将第一行命名为“1”时,在查看器中看起来没有任何不同)。

在这种情况下,你将不得不坚持更冗长的:

df <- data.frame(a = "a", b = 1)
df <- data.frame(df, row.names = df[,1])

但柱子不会被移走。还要记住,如果删除一个列,最终得到一个单列数据框架,R 将把它简化为一个原子向量。在这种情况下,您需要使用额外的 drop参数:

df <- data.frame(df[,-1, drop = FALSE], row.names = df[,1])