【问题标题】:Order a matrix by column "patters" with R使用 R 按列“模式”对矩阵进行排序
【发布时间】:2019-02-07 15:33:55
【问题描述】:

这是一个数据框;

    204 205 206 207 208 209 210 211 212 213
X1  0   1   1   0   0   1   1   1   1   0
X2  0   1   1   0   0   1   1   1   1   0
X3  0   0   1   0   0   1   1   1   1   0
X4  0   0   0   1   0   1   1   0   1   0
X5  1   0   1   0   1   1   1   1   0   1

我想对列进行排序,以便在热图中获得最佳表示,其中 1 为红色,0 为白色。 所以我应该得到类似的东西:

    209 210 212 212 206 211 205 207 204 213
X1  1   1   1   1   1   1   1   0   0   0
X2  1   1   1   1   1   1   1   0   0   0
X3  1   1   1   1   1   1   0   0   0   0
X4  1   1   1   1   0   0   0   1   0   0
X5  1   1   0   0   1   1   0   0   1   1

这个想法是在同一行中收集更多的 0 和 1,以获得可能的最佳热图表示。

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    您可以将列和行排序为:

    mat <- mat[, order(colSums(mat), decreasing = T)]
    mat[order(rowSums(mat), decreasing = T),]
    
       209 210 206 211 212 205 204 207 208 213
    X5   1   1   1   1   0   0   1   0   1   1
    X1   1   1   1   1   1   1   0   0   0   0
    X2   1   1   1   1   1   1   0   0   0   0
    X3   1   1   1   1   1   0   0   0   0   0
    X4   1   1   0   0   1   0   0   1   0   0
    

    编辑

    您也可以考虑权重向量:

    weights <- c(5:1)
    
    mat[, order(colSums(weights%*%mat), decreasing = T)]
    
       209 210 212 206 211 205 207 204 208 213
    X1   1   1   1   1   1   1   0   0   0   0
    X2   1   1   1   1   1   1   0   0   0   0
    X3   1   1   1   1   1   0   0   0   0   0
    X4   1   1   1   0   0   0   1   0   0   0
    X5   1   1   0   1   1   0   0   1   1   1
    

    【讨论】:

    • 在您的输出中,204 和 208 应该彼此相邻,因为它们都是 1000 ...也许同时对列和行进行排序会起作用?
    • 我想你可以只考虑一些重量,工作就完成了。
    • 乐于助人。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。
    【解决方案2】:

    假设你的data.frame 被称为df,你可以这样做:

    df[, order(colSums(df), decreasing = TRUE)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多