如何使用 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
部分缺失时,会将数据排列为1
、10
、11
、...等。
【讨论】:
【参考方案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语言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