【问题标题】:Sorting each row of a data frame [duplicate]对数据框的每一行进行排序[重复]
【发布时间】:2015-07-31 18:07:00
【问题描述】:

我正在尝试使用这一行对数据框的每一行进行排序,

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

有什么建议吗?谢谢

【问题讨论】:

    标签: r sorting


    【解决方案1】:

    您可以使用普通的 apply 函数和 MARGIN = 1 来应用行,然后转置结果。

    t(apply(df, 1, sort))
    

    【讨论】:

    • 如果 MARGIN 为 2,则输出将是矩阵,但按列排序。为什么在按Rows排序的时候要转置呢?
    【解决方案2】:

    您可以转置它(将其转换为矩阵),并按列拆分和排序

    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
    

    因为 data.frame 是一个列列表,所以当您 sapply 这样您正在对列进行排序时。

    apply 按行

    t(apply(df, 1, sort))
    

    【讨论】:

    • 我也有类似的想法:do.call(rbind, lapply(split(df, seq_len(nrow(df))), sort)) 我认为这里的任何方法都涉及将每一行转换为原子向量(以便对其进行排序),这与将整个事物转换为矩阵大致相同.
    • @Frank 是的,这也可以,但是对于较大的数据非常慢
    • 嗯,也许是这样——t(sapply( 击败了do.call(rbind,lapply(——尽管我不知道为什么。另一方面,拆分前的转置看起来很浪费,不如split(df,seq_len(nrow(df)))。如果您有一些支持转置的基准,我会感到惊讶和感兴趣。
    • @Frank 是的,第一部分是慢的部分
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2021-06-25
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多