【问题标题】:Rearrange a matrix: collapsing columns to remove NAs重新排列矩阵:折叠列以删除 NA
【发布时间】:2016-01-17 20:21:58
【问题描述】:

经过仔细搜索,我仍然无法解决我的问题,就是这样。 我有一个矩阵,里面有很多像这样的NAs:

matrix(c(NA,NA,1,NA,NA,-3,  -1,NA,NA,NA,NA,NA,  NA,2,NA,NA,NA,NA,  NA,3,NA,NA,-2,5,  NA,NA,NA,NA,NA,NA,  NA,NA,NA,6,-7,NA),ncol=6,nrow = 6)

产生以下内容

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   -1   NA   NA   NA   NA
[2,]   NA   NA    2    3   NA   NA
[3,]    1   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA    6
[5,]   NA   NA   NA   -2   NA   -7
[6,]   -3   NA   NA    5   NA   NA

我的目标是折叠矩阵以具有:1)向上移动所有值以摆脱NAs 所产生的行数; 2)相同的列数。在这种情况下,生成的矩阵将是 3X6,因为在任何情况下,每列的值都不超过 3 个。 这是我试图获得的矩阵:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -1    2    3   NA    6
[2,]   -3   -1    2   -2   NA   -7
[3,]    1   -1    2    5   NA    6

1) 具有单个值的列重复它; 2)具有两个值的列在第二次出现时具有第二个值,而当它们出现第三次时,它们再次采用第一个值(并最终为其他行保留它); 3)具有三个值的列每次都会更改它。包含所有NAs 的列可以保持不变。

一个完整的解决方案会很棒,但我很乐意获得有关如何进行此类复杂重组的提示。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    假设m 是输入矩阵,找出任意列中非NA 的最大数量,然后将rep_len 应用于每一列中的非NA 到该长度:

    mx <- max(colSums(!is.na(m)))
    apply(m, 2, function(x) rep_len(na.omit(x), mx))
    

    给予:

         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1   -1    2    3   NA    6
    [2,]   -3   -1    2   -2   NA   -7
    [3,]    1   -1    2    5   NA    6
    

    【讨论】:

    • 工作精美,简单有效。太好了,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2021-07-21
    • 2020-01-07
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多