按行将数据添加到空矩阵中并处理丢失的数据

时间:2016-12-08 07:59:42

标签: r matrix

我有一个带有一定数量列的空矩阵,我试图逐行填充for-loop的输出向量。但是,有些输出与我的矩阵的列数不同,只是想用NAs填充那些“空格”。

例如:

matrix.names <- c("x1", "x2", "x3", "x4", "y1", "y2", "y3", "y4", "z1", "z2", "z3", "z4")
my.matrix <- matrix(ncol = length(matrix.names))
colnames(my.matrix) <- matrix.names

这将是一次迭代的输出:

x <- c(1,2)
y <- c(4,2,1,5)
z <- c(1)

我希望它在矩阵中这样:

      x1 x2  x3 x4 y1 y2 y3 y4 z1 z2 z3 z4
[1,]   1  2  NA NA  4  2  1  5  1 NA NA NA

下一次迭代的输出将是,例如:

x <- c(1,1,1,1)
y <- c(0,4)
z <- c(4,1,3)

并添加为矩阵中的新行:

      x1 x2 x3 x4 y1 y2 y3 y4 z1 z2 z3 z4
[1,]   1  2 NA NA  4  2  1  5  1 NA NA NA
[2,]   1  1  1  1  0  4 NA NA  4  1  3 NA

如果我有一个0,那真的不是一个问题,它就是没有数据的地方。此外,数据以这样的方式保存:首先在行中列出任何内容,然后在空插槽中列出NA。换句话说,我不担心NA是否会首先弹出。

另外,在数据帧而不是矩阵中处理​​这样的事情会更好吗?

2 个答案:

答案 0 :(得分:1)

不是有效的答案:只是一个尝试

logic:将长度扩展为4.(例外情况可能是已经x / y / z已经是长度为4)因此,rbind我只提取前4个元素。

x[length(x)+1:4] <- NA  
y[length(y)+1:4] <- NA
z[length(z)+1:4] <- NA


my.matrix <- rbind(my.matrix,c(x[1:4],y[1:4],z[1:4]))

注意:我上面提到的例外情况如下:

> x <- c(1,1,1,1)
> x
[1] 1 1 1 1
> x[length(x)+1:4] <- NA
> x
[1]  1  1  1  1 NA NA NA NA  # therefore I extract only the first four

答案 1 :(得分:0)

以下是以编程方式执行此操作的选项

d1 <- stack(mget(c("x", "y", "z")))[2:1]
nm <- with(d1, paste0(ind, ave(seq_along(ind),ind, FUN = seq_along)))
my.matrix[,match(nm,colnames(my.matrix), nomatch = 0)] <- d1$values
my.matrix
#     x1 x2 x3 x4 y1 y2 y3 y4 z1 z2 z3 z4
#[1,]  1  2 NA NA  4  2  1  5  1 NA NA NA

或其他选项stri_list2matrix来自stringi

library(stringi)
m1 <- as.numeric(stri_list2matrix(list(x,y, z)))

更改&#39; x&#39;,&#39; y&#39;,&#39; z&#39;值

m2 <- as.numeric(stri_list2matrix(list(x,y, z)))
rbind(m1, m2)