我创建了一个随机森林并预测了我的测试集的类,这些类在数据帧中幸福地生活:
row.names class 564028 1 275747 1 601137 0 922930 1 481988 1 ...
在我执行各种操作之前,row.names
属性告诉我哪一行是哪一行,这些操作在过程中扰乱了行的顺序。到目前为止一切都很好。
现在我想对我的预测的准确性有一个普遍的感觉。为此,我需要根据row.names
属性获取此数据帧并按升序对其重新排序。通过这种方式,我可以逐行地将这些观察结果与我已经知道的标签进行比较。
请原谅我提出这样一个基本问题,但对于我的生活,我找不到关于如何完成这项微不足道任务的良好信息来源。
文档恳求我:
如果需要检索一组整数值的行名,请使用
attr(x, "row.names")
。
但是除了NULL
之外什么都没有。
我的问题是,如何在整个工作流程中使用row.names
忠诚跟随我的数据框架的各种版本?这不是它的用途吗?
答案 0 :(得分:22)
这些解决方案都不会真正起作用。它应该是:
df[ order(as.numeric(row.names(df))),]
#assuming数据框名为df
因为R中的rowname是'character',当 as.numeric 部分缺失时,它会将数据排列为1,10,11 ......等等。
答案 1 :(得分:18)
这对我有用:
new_df <- df[ order(row.names(df)), ]
答案 2 :(得分:2)
为了完整性:
@ BondedDust的答案适用于rownames属性,但您的示例不使用rownames属性。您的问题中提供的输出表示使用名为&#34; row.names&#34;的列,这不是相同的事情(所有列在@BondedDust&#39的评论中)。 如果您希望按&#34; row.names&#34;排序,那么就是答案。您问题中给出的示例中的列(此处有另一个帖子,位于here)。这个答案假设您正在使用名为&#34; df&#34;的数据框,其中一列名为&#34; row.names&#34;:
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
希望这有用!
答案 3 :(得分:1)
这将几乎自动完成,因为“[”函数将以任何可与rownames匹配的向量的词汇顺序显示():
df[ rownames(df) , ]
您可能认为有必要使用:
df[ order(rownames(df)) , ]
但那会给你1:100的1,10,100,12,13,......,2,20,21 ......的排序,因为“[”的参数被强制转换为字符。
答案 4 :(得分:0)
假设您的数据框名为'df',您可以创建一个新的有序数据框'ord.df',它将包含df的行名称以及以下一行代码中的值:
>ord.df<-cbind(rownames(df)[order(rownames(df))], df[order(rownames(df)),])
答案 5 :(得分:0)
new_df <- df[ order(row.names(df)), ]
或类似的东西不会起作用。在此声明之后,new_df
不再具有rowname。我想更好的解决方案是将列添加为rowname,按其排序,并将其设置为rowname
答案 6 :(得分:0)
如果您的数据框中只有一列,就像我的情况一样,您必须添加drop = F:
mobx = require 'mobx'
state = mobx.observable
items:['a','b']
compute = (key,fn)->
obj = {}
obj[key] = mobx.computed fn.bind state
mobx.extendObservable state, obj
compute 'num', ->
@items.length
mobx.autorun ->
console.log "items = #{state.items}"
mobx.autorun ->
console.log "num = #{state.num}"
state.items.push 'c'
答案 7 :(得分:0)
您可以使用以下命令简单地对df进行排序:
df <- df[sort(rownames(df)),]
然后做你想做的事!