在现有的数据框中,将一列的值转换为行名称。

163

我希望将现有数据框中一列的值转换为行名称。是否可以在不导出数据框并重新使用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

Into:

> 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
5个回答

175

这应该可以:

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> 

10
rownames(df) <- df[,1] 在此出现错误:row.names<-.data.frame(*tmp*, value = value),原因是'row.names'长度无效。另外,还有一个警告信息:在tibble上设置行名已被弃用。 - user3673
3
@user3673 可能的嫌疑是您没有使用数据框。通过 class(df) 进行验证。如果这给出了多个类,请简单地调用 df <- as.data.frame(df),这应该解决问题。 - R. Iersel

92

截至2016年,您也可以使用tidyverse

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

9
更具体地说,它是tibble::column_to_rownames - Ott Toomet
1
我收到一个警告:“在tibble上设置行名称已被弃用”。 - Quantum7
1
tibble可视化不显示行名,但是如果要查看它,您需要将其管道传递到as.data.frame()函数中:samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame() - Matteo
看起来最新版本的包自动处理了从tibble到data.frame的转换。 - Andrew Brēza

28

一句话概括

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

21

看起来单行代码已经更简单了(目前使用的是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)

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

对于只有一行的数据框

要注意,如果数据框只有一行,会出现令人困惑的行为。正如文档所述:

如果提供长度为一的行名,并且数据框只有一行,则 row.names 被视为指定行名而不是列(按名称或编号)。

这意味着,如果您使用与上面相同的命令,则可能看起来没有做任何事情(实际上它将第一行命名为“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])

2
太好了!我直接采用了tidyverse解决方案,没有检查基础的R是否有方便处理此问题的方法。下次我应该从基础开始。 - Andrew Brēza

13

您可以用2个简单语句执行此操作:

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

适用于 R 3.5.3 - TheSciGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接