Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用新维度创建新矩阵并忽略NA值_R_Matrix_Dimension - Fatal编程技术网

R 使用新维度创建新矩阵并忽略NA值

R 使用新维度创建新矩阵并忽略NA值,r,matrix,dimension,R,Matrix,Dimension,我有一个矩阵,有一些NA值 例如: [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 NA 8 11 [3,] 3 6 NA 12 我想用上面矩阵中的数据创建一个新的矩阵,新的维度没有NA值。(可以只使用最后一些元素) 比如: [,1] [,2] [,3] [1,] 1 6 11 [2,] 2 7 12 [3,]

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

        [,1] [,2] [,3] [,4]
[1,]    1    4    7    10
[2,]    2    NA   8    11
[3,]    3    6    NA   12
我想用上面矩阵中的数据创建一个新的矩阵,新的维度没有NA值。(可以只使用最后一些元素)

比如:

       [,1] [,2] [,3] 
[1,]    1    6    11   
[2,]    2    7    12   
[3,]    3    8    NA   
[4,]    4    10   NA
如果有人能帮助我,我将不胜感激

谢谢

这里有一个方法:

# 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
#复制您的数据

m类似这样的事情:

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)

m如果您想保持按列或按行的顺序,这是相当简单的

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
行方式:

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

m又是一次尝试。这将保持值的列顺序,就像矩阵通常那样。例如:

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

这可以做这项工作,但不知道这是否是一个好办法

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

list1如果用
length(x)Ha增加数值向量的长度,是的,我选择了一个有点复杂的路径来计算NAs!正如@Tylerlinker所证明的,
rep(NA,prod(dims)-length(NA.omit(c(m)щщ)
可以替换为
rep(NA,sum(is.NA(m)))
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
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
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
list1 <- m[m]
list2 <- m[!is.na(m)]
element1 <- list2
element2 <- rep(NA, (length(list1)-length(list2)))
newm <- matrix(c(element1,element2), nrow=4)
## 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