我有一个带有一定数量列的空矩阵,我试图逐行填充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是否会首先弹出。
另外,在数据帧而不是矩阵中处理这样的事情会更好吗?
答案 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)