如何使用 row.names 属性在 R 中对数据框的行进行排序?

Posted

技术标签:

【中文标题】如何使用 row.names 属性在 R 中对数据框的行进行排序?【英文标题】:How can I use the row.names attribute to order the rows of my dataframe in R? 【发布时间】:2013-12-16 05:48:42 【问题描述】:

我创建了一个随机森林并预测了我的测试集的类,它们在数据框中快乐地生活:

row.names 类 564028 1 275747 1 601137 0 922930 1 481988 1 ...

row.names 属性告诉我哪一行是哪一行,在我执行各种操作之前,这些操作在此过程中打乱了行的顺序。到目前为止一切顺利。

现在我想大致了解一下我的预测的准确性。为此,我需要获取此数据框并根据row.names 属性以升序对其进行重新排序。这样,我可以逐行比较观察结果与我已经知道的标签。

请原谅我问了这么一个基本的问题,但是对于我的一生,我找不到关于如何完成这样一个微不足道的任务的良好信息来源。

文档恳求我:

如果您需要检索一组整数值的行名,请使用 attr(x, "row.names")

但这让我只剩下NULL

我的问题是,我如何使用row.names,它在我的整个工作流程中以各种数据帧的形式一直忠实地跟随我?这不就是它的用途吗?

【问题讨论】:

这个问题有一个微妙之处,因为有一个名为“row.names”的列与名为“row.names”的属性不同。我刚刚得到的反对票(在我回复后 18 个月)可能合适,也可能不合适。我想其他读者可以提出他们的意见。 是的,这不是很清楚,因为文本确实明确表示“根据 row.names attribute”,并且接受的答案在 row.names 属性上运行。在这种情况下,我认为@ToNoY 的答案是正确的。 (它对我来说工作正常。) 【参考方案1】:

其他解决方案都不会真正起作用。

应该是:

# Assuming the data frame is called df
df[ order(as.numeric(row.names(df))), ]

由于R中的行名是character,当as.numeric部分缺失时,会将数据排列为11011、...等。

【讨论】:

【参考方案2】:

这对我有用:

new_df <- df[ order(row.names(df)), ]

【讨论】:

寻找相同事物的人,请查看下方 ToNoY 的答案。当您发现订单错误时,它将为您节省时间【参考方案3】:

如果您的数据框中只有一列,就像我的情况一样,您必须添加 drop=F:

df[ order(rownames(df)) , ,drop=F]

【讨论】:

【参考方案4】:

为了完整性:

@BondedDust 的答案非常适用于 rownames 属性,但您的示例不使用 rownames 属性。您的问题中提供的输出表明使用了名为“row.names”的列,这不是一回事(所有列在@BondedDust 的评论中)。如果您希望按问题中给出的示例中的“row.names”列进行排序,这里将是答案(对此有另一个帖子,位于here)。此答案假设您使用的是名为“df”的数据框,其中一列名为“row.names”:

ordered.df <- df[order(df$row.names),]   #this orders the df by the "row.names" column

或者,按第一列排序(如果您仍在使用您的示例,则相同):

ordered.df <- df[order(df[,1]),]         #this orders the df by the first column

希望对您有所帮助!

【讨论】:

【参考方案5】:

这几乎是自动完成的,因为“[”函数将按可以匹配到 rownames() 的任何向量的词法顺序显示:

df[ rownames(df) , ]

您可能认为有必要使用:

df[ order(rownames(df)) , ]

但这会给您 1,10,100, 12,13, ...,2,20,21, ... 的 1:100 排序,因为 "[" 的参数被强制转换为字符。

【讨论】:

两个问题:首先,我认为数据框的功能是row.names(尽管rownames 似乎确实有效,可能是为了挽救大家的理智)。其次,我刚刚尝试了您的建议,并且没有order 部分,这些行只是按照它们已经存在的顺序吐出 - 没有重新排序。不过,@ToNoY 转换为数字的提示对我有用。 rownames 可以处理任何二维或更多维度的对象。此外,上面的示例令人困惑,因为 row.names 属性从未被 print 函数标记在与列名相同的行上。同意@ToNoY 的回答是最好的。【参考方案6】:

假设您的数据框名为“df”,您可以创建一个新的有序数据框“ord.df”,其中将包含 df 的行名及其值,如下一行代码:

>ord.df<-cbind(rownames(df)[order(rownames(df))], df[order(rownames(df)),])

【讨论】:

【参考方案7】:
new_df <- df[ order(row.names(df)), ]  

或类似的东西不起作用。在此语句之后,new_df 不再有行名。我想一个更好的解决方案是添加一列作为行名,按它排序,并将其设置为行名

【讨论】:

>df$rownames df #现在删除列 >df$rownames 【参考方案8】:

您可以使用以下方法简单地对您的 df 进行排序:

df <- df[sort(rownames(df)),]

然后做你想做的!

【讨论】:

以上是关于如何使用 row.names 属性在 R 中对数据框的行进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

R语言-数据框

R语言row.names函数为dataframematrix设置行名称实战

R语言merge函数使用数据行名称内连接dataframe数据使用数据行名称连接dataframe数据设置by=0或者row.names,all=TRUE使用rownames函数为数据行命名

如何在不添加“Row.names”列的情况下按行名合并数据框?

R中row names were found from a short variable and have been discarded

R语言数据转置