重新排列矩阵 : 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/

相关文章:

c - 使用 .Call 获取从 C 到 R 语言的整数 vector

安卓饱和度滤镜矩阵

r - 将函数(分位数)应用于矩阵行并使用结​​果修改行

"condense"矩阵的 Pythonic 方式

r - 在数据框中结转的上次观察结果?

r - 如何创建有偏随机数生成器?

r - 将文件排序为与另一个文件具有相同的列顺序

r - 如何将堆叠的长数据帧转换为宽格式

r - 如何用其他矩阵匹配行和列的值填充矩阵?

matrix - 当给定行和列的总和时确定矩阵的元素