【问题标题】:Sort values in a list by columns of a matrix按矩阵的列对列表中的值进行排序
【发布时间】:2020-10-05 23:58:31
【问题描述】:

我需要根据单独矩阵中的值对数据框中每一列的值进行排序。请注意,每一列都将独立于其他列进行排序(即不仅仅是按行索引排序)。该矩阵与数据帧具有相同的维度,并且值对应于应从数据帧返回的行号。

代表:

library(magrittr)
library(dplyr)

data("starwars")
data <- starwars[1:3, 1:3]
data
#> # A tibble: 3 x 3
#>   name           height  mass
#>   <chr>           <int> <dbl>
#> 1 Luke Skywalker    172    77
#> 2 C-3PO             167    75
#> 3 R2-D2              96    32

sorting_order <- cbind(c(2,3,1),
                       c(3,2,1),
                       c(1,3,2))
sorting_order
#>      [,1] [,2] [,3]
#> [1,]    2    3    1
#> [2,]    3    2    3
#> [3,]    1    1    2

期望的输出:

#>             name height mass
#> 1          C-3PO     96   77
#> 2          R2-D2    167   32
#> 3 Luke Skywalker    172   75

我意识到可以使用循环来完成,但我正在寻找一种更有效的方法,因为我将处理更大的数据集。

【问题讨论】:

    标签: r dataframe sorting matrix


    【解决方案1】:

    使用 baseR 函数的一个选项:

    data[] <- Map(`[`, data, split(sorting_order, col(sorting_order)))
    data
    # A tibble: 3 x 3
    #  name           height  mass
    #  <chr>           <int> <dbl>
    #1 C-3PO              96    77
    #2 R2-D2             167    32
    #3 Luke Skywalker    172    75
    

    1) 我们从您的矩阵中创建一个向量列表:

    split(sorting_order, col(sorting_order))
    #$`1`
    #[1] 2 3 1
    #
    #$`2`
    #[1] 3 2 1
    #
    #$`3`
    #[1] 1 3 2
    

    cmets中提到的更直接的方式是asplit

    asplit(sorting_order, 2)
    

    感谢@GKi

    2) Map 用于根据 1) 中的列表重新排列 data。以第一列为例:

    data[, 1, drop = TRUE][c(2,3,1)]
    #[1] "R2-D2"          "Luke Skywalker" "C-3PO" 
    

    这只是为每一列完成。

    【讨论】:

    • 相同但使用asplit:mapply("[", data, asplit(sorting_order, 2))
    【解决方案2】:

    另一种 Base-R 方法

    do.call(cbind,lapply(1:ncol(data), function(x)  data[sorting_order[x,],][,x]))
    
                name height mass
    1          C-3PO     96   77
    2          R2-D2    167   77
    3 Luke Skywalker     96   75
    

    【讨论】:

    • 不是最容易阅读的代码,但它可以在一行中完成工作并保留列类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多