数据框中每行的排序

8

我正在尝试使用以下代码对数据框的每一行进行排序:

sapply(df, function(x) sort(x))

然而,列正在被排序,而不是行。
例如,这个数据框:
5          10          7          1          5
6           3          9          2          4
4           5          1          3          3

变成了这样:

4           3          1          1          3
5           5          7          2          4
6          10          9          3          5

我希望你能为我提供以下内容:

1 5 5 7 10
2 3 4 6 9
1 3 3 4 5

有什么建议吗?谢谢。
2个回答

19
你可以使用普通的apply函数,并将MARGIN = 1与其一起使用来对行进行应用,然后转置结果。
t(apply(df, 1, sort))

如果MARGIN为2,则输出将是矩阵,但按列排序。为什么我们在按行排序时必须转置它? - Varun Gawande

5
你可以转置它(将其转换为矩阵),按列拆分并排序。
t(sapply(split(t(df), col(t(df))), sort))
#   [,1] [,2] [,3] [,4] [,5]
# 1    1    5    5    7   10
# 2    2    3    4    6    9
# 3    1    3    3    4    5

因为数据框是列的列表,所以当您像这样使用 sapply 时,您正在对列进行排序。
或者按行使用 apply
t(apply(df, 1, sort))

我有一个类似的想法:do.call(rbind, lapply(split(df, seq_len(nrow(df))), sort))。我认为这里的任何方法都涉及将每一行转换为原子向量(以便可以排序),这与将整个东西转换为矩阵大致相同。 - Frank
@Frank 是的,那也可以,但对于更大的数据来说速度非常慢。 - Rorschach
嗯,也许是这样--t(sapply(do.call(rbind,lapply(更快--尽管我不明白为什么。对于另一部分,在拆分之前进行转置看起来很浪费,而且不如split(df,seq_len(nrow(df)))。如果你有一些支持转置的基准测试结果,我会感到惊讶并且感兴趣。 - Frank
1
@Frank 是的,第一部分是较慢的部分。 - Rorschach

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