2016-12-08 45 views
1

我有一個空矩陣和一定數量的列,我試圖逐行填充for循環的輸出向量。然而,其中一些輸出的長度與矩陣的列數不同,只是想用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,它只是在沒有數據。另外,數據以這樣的方式保存,即首先在行中列出任何內容,然後在空槽中列出NAs。換句話說,我不擔心NA是否會首先出現。

此外,這樣的事情更好地處理數據框而不是矩陣?

+0

謝謝@ joel.wilson爲編輯 –

+0

我下面貼的解決方案,請檢查是否正常工作 – akrun

回答

1

不是有效的答案:只是一個嘗試

logic:長度延伸到4(例外可能是,如果已經X/Y/Z是laready length4的)。因此,同時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 
+0

會什麼的+1:4呢? –

+0

所以我擴展當前長度使其長度爲4 bcoz我們想要每個向量'x/y/z'都是長度爲4的右邊 –

+0

對吧,明白了!我會試一試 –

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 

或者另一種選擇是從stringistri_list2matrix

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

改變「X」,「Y」,「Z」值

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