创建具有新维度的新矩阵并省略NA值

时间:2014-06-11 02:37:46

标签: r matrix dimension

我有一个带有一些NA值的矩阵 例如:

        [,1] [,2] [,3] [,4]
[1,]    1    4    7    10
[2,]    2    NA   8    11
[3,]    3    6    NA   12

我想用上面的矩阵中的数据创建新矩阵,其中包含新维度和无NA值。 (可以让NA只有最后一些元素)

类似的东西:

       [,1] [,2] [,3] 
[1,]    1    6    11   
[2,]    2    7    12   
[3,]    3    8    NA   
[4,]    4    10   NA

如果有人能帮助我,我将不胜感激。

由于

7 个答案:

答案 0 :(得分:2)

这样的东西:

m <- matrix(1:12, nc=4)
m[c(5, 9)] <- NA

matrix(c(na.omit(c(m)), rep(NA, sum(is.na(m)))), nrow=4)

答案 1 :(得分:2)

m <- matrix(1:12, nc=4)
m[c(5, 9)] <- NA


# create an array of the appropriate class and dimension (filled with NA values)
dims <- c(4, 3)
md <- array(m[0], dim=dims)
# replace first "n" values with non-NA values from m
nonNAm <- na.omit(c(m))
md[seq_along(nonNAm)] <- nonNAm
md
#      [,1] [,2] [,3]
# [1,]    1    6   11
# [2,]    2    7   12
# [3,]    3    8   NA
# [4,]    4   10   NA

答案 2 :(得分:2)

又一次尝试。这将按列顺序保持值的顺序,通常为矩阵。 E.g:

mat <- matrix(c(1,2,3,4,NA,6,7,8,NA,10,11,12),nrow=3)

array(mat[order(is.na(mat))],dim=dim(mat))

#     [,1] [,2] [,3] [,4]
#[1,]    1    4    8   12
#[2,]    2    6   10   NA
#[3,]    3    7   11   NA

现在更改一个值以检查它是否影响排序。

mat[7] <- 20

array(mat[order(is.na(mat))],dim=dim(mat))

#     [,1] [,2] [,3] [,4]
#[1,]    1    4    8   12
#[2,]    2    6   10   NA
#[3,]    3   20   11   NA

然后,您可以指定dim=参数的任何尺寸:

array(mat[order(is.na(mat))],dim=c(4,3))

#     [,1] [,2] [,3]
#[1,]    1    6   11
#[2,]    2   20   12
#[3,]    3    8   NA
#[4,]    4   10   NA

答案 3 :(得分:1)

以这种方式:

# Reproducing your data
m <- matrix(1:12, nc=4)
m[c(5, 9)] <- NA

# Your desired dimensions
dims <- c(4, 3)
array(c(na.omit(c(m)), rep(NA, prod(dims) - length(na.omit(c(m))))), dim=dims)

#      [,1] [,2] [,3]
# [1,]    1    6   11
# [2,]    2    7   12
# [3,]    3    8   NA
# [4,]    4   10   NA

答案 4 :(得分:1)

如果您希望按列或按行保留顺序,这是相当简单的。

originalMatrix <- matrix(c(1,2,3,4,NA,6,7,8,NA,10,11,12),nrow=3)

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2   NA    8   11
[3,]    3    6   NA   12

newMatrixNums <- originalMatrix[!is.na(originalMatrix)]

[1]  1  2  3  4  6  7  8 10 11 12

垫NA:

newMatrixNums2 <- c(newMatrixNums,rep(NA,2))

逐列:

matrix(newMatrixNums2,nrow=3)
     [,1] [,2] [,3] [,4]
[1,]    1    4    8   12
[2,]    2    6   10   NA
[3,]    3    7   11   NA

行方向:

matrix(newMatrixNums2,nrow=3,byrow=T)

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    6    7    8   10
[3,]   11   12   NA   NA

答案 5 :(得分:0)

这可以胜任,但不知道这是不是一个好方法。

list1 <- m[m]
list2 <- m[!is.na(m)]
element1 <- list2
element2 <- rep(NA, (length(list1)-length(list2)))
newm <- matrix(c(element1,element2), nrow=4)

答案 6 :(得分:0)

如果使用length(x)<-增加数字向量的长度而不为新元素指定值,则会为新值指定NA作为其值。因此length(M2) <- length(M)采用较短的M2向量,并通过向新元素添加NA值使其与M的长度相同。

## original
> (M <- matrix(c(1:4,NA,6:8,NA,10:12), nrow = 3))
#      [,1] [,2] [,3] [,4]
# [1,]    1    4    7   10
# [2,]    2   NA    8   11
# [3,]    3    6   NA   12

## new
> M2 <- M[!is.na(M)]; length(M2) <- length(M)
> matrix(M2, ncol(M))
#      [,1] [,2] [,3]
# [1,]    1    6   11
# [2,]    2    7   12
# [3,]    3    8   NA
# [4,]    4   10   NA