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

Posted

技术标签:

【中文标题】将列中的值转换为现有数据框中的行名【英文标题】:Convert the values in a column into row names in an existing data frame 【发布时间】:2011-07-30 03:36:29 【问题描述】:

我想将现有数据框的列中的值转换为行名。是否可以在不导出数据框的情况下执行此操作,然后使用 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

【问题讨论】:

【参考方案1】:

应该这样做:

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> 

【讨论】:

> rownames(df)row.names<-.data.frame(*tmp*, value = value) 中的错误:'row.names' 长度无效另外:警告消息:设置行不推荐使用 tibble 上的名称。【参考方案2】:

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

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

【讨论】:

更具体地说是tibble::column_to_rownames 我收到警告“不推荐在小标题上设置行名称” tibble 可视化不显示行名,但是,要查看它,您需要将其传送到 as.data.frame() samp %&gt;% remove_rownames %&gt;% column_to_rownames(var="names") %&gt;% as.data.frame() 看起来最新版的包会自动处理tibble到data.frame的转换。【参考方案3】:

一行

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

适用于 R 3.5.3【参考方案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)

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

【讨论】:

整洁!我直接去找 tidyverse 解决方案,没有检查 base R 是否有一个方便的方法来处理这个问题。我应该从基地开始。

以上是关于将列中的值转换为现有数据框中的行名的主要内容,如果未能解决你的问题,请参考以下文章

将列中的所有值复制到熊猫数据框中的新列

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

将列中的唯一值分隔到同一数据框中的单独列中

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

将列添加到数据框中,测试其他列中的分类变量

对 Spark 数据框中的行进行洗牌