重新排列矩阵 : collapsing columns to remove NAs

标签 r matrix

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

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)通过向上移动所有值以摆脱 NA 产生的行数s; 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) 带有三个值的列每次都会改变它。列与所有 NA s 可以保持不变。

一个完整的解决方案会很棒,但我很高兴获得有关进行这种复杂重组的方式的提示。

最佳答案

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

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

关于重新排列矩阵 : collapsing columns to remove NAs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843199/

相关文章:

r - 剪切/剪切多边形外部的所有内容或用白色填充外部

r - 使用 R 和 rvest 进行网页抓取

c++ - c++类和OpenCV矩阵运算之间的转换

java - 给定图中无向图BFS的“邻接矩阵”表示形式并输出顶点

matlab - 如何使用逻辑索引MATLAB获取3d矩阵中每个切片中某些区域的平均值

r - 如何将新列添加到数据框(到前端而不是末尾)?

r - 在 R (dplyr) 中重置的条件运行计数(累计和)

r - 在多条线上拆分绘图轴标签

c# - 打印出矩阵及其转置,C#

c++ - 二维矩阵变换(有玩家和地面)