如何对只有一列的数据框进行排序,而不丢失行名称?

43
data = c(1,2,3,4)
names = c("foo", "bar", "baz", "yak")
d = data.frame(data, row.names=names)

这将返回:

    data
foo    1
bar    2
baz    3
yak    4

现在,我想按列对这个数据框进行排序,同时保留行名称。因此,我的结果将是:

    data
yak    4
baz    3
bar    2
foo    1

我已经尝试了以下方法:

  • d[order(-d$data),],当然这只给了我一维列表。

  • 使用plyr包中的arrange(d, desc(data)),但会删除行名。

  • 通过o = order(-d$data)找到排序顺序,然后使用

    data.frame(d[o,], row.names=rownames(d)[o])
    

    ...这仍然让我有错误的列名。

有没有什么明智的方法可以解决这个问题?

1个回答

49

你的第一次尝试非常接近,只是忘记了使用 drop = FALSE

> d[order(-d$data), , drop = FALSE]
    data
yak    4
baz    3
bar    2
foo    1

啊,有趣。在这里读到“drop”关键字之后,我才发现这个问题,现在让我思考R是否删除维度是一个好主意。我会去了解一下的。 - slhck
2
我认为每个人都已经问过这个问题了。R之神们的共识是,这个默认设置并不是很好,但是如果更改它,大多数现有的代码将会过时。这将在Q中得到纠正。 - Dieter Menne
当我使用这个解决方案时,我过滤掉了除一个之外的所有行。这是怎么发生的? - Kory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接