在R中对data.frame进行排序,保持行名称

时间:2013-05-22 14:54:23

标签: r sorting dataframe

我有一个data.frame,其中包含几个Managers的每日百分比回报,我想对data.frame进行排序,以便拥有最好的5个表现者和最差的5个表演者。

我找到了函数sort(x)rev(sort(x)),但它们不维护rownames,我需要它们来检查Managers的名称。

任何提示?

3 个答案:

答案 0 :(得分:2)

您想要order

df = data.frame(a = c(4:1), b = c(1:4), row.names = paste0('blah', c(1:4)))
df
#      a b
#blah1 4 1
#blah2 3 2
#blah3 2 3
#blah4 1 4

df[order(df$a),]
#      a b
#blah4 1 4
#blah3 2 3
#blah2 3 2
#blah1 4 1

答案 1 :(得分:2)

我遇到了同样的问题,但在SO上看到的Q& A I都没有处理单列数据帧。当你只有一列时,@ eddi的答案不起作用:

df.2col <- data.frame(a = c(4:1), b = c(1:4), row.names = paste0('blah', c(1:4)))

print(df.2col[order(df$a),])

产生一个很好的排序数据框:

      a b
blah4 1 4
blah3 2 3
blah2 3 2
blah1 4 1

但是,只有一列,

df.1col <- data.frame(a = c(4:1), row.names = paste0('blah', c(1:4)))

print(df.1col[order(df$a),])

行名称被删除:

[1] 1 2 3 4

我不得不诉诸的kludgy解决方案是对数据和行进行排序:

df.sorted<-data.frame(a=df.1col$a[order(df.1col$a)],row.names=row.names(df.1col)[order(df.1col$a)])

print(df.sorted)

期望的结果:

      a
blah4 1
blah3 2
blah2 3
blah1 4

如果有更好的方法可以做到这一点,我将不胜感激任何指导

答案 2 :(得分:2)

我在其他网站上找到了这个,它对我有用:

如果选择单个列,则默认为删除data.frame property.To抑制此行为,您可以设置drop = FALSE:

i