2016-12-08 14 views
1

forループの出力ベクトルを行単位で埋めようとしている特定の数の列を持つ空行列があります。しかし、出力の中には行列の数と同じ長さではなく、単にそれらの空のスペースをNAsで埋める必要があります。例えば空の行列に行単位でデータを追加し、欠落したデータを処理する

:出力

 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,2) 
y <- c(4,2,1,5) 
z <- c(1) 

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,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

が、私はそれが –

+0

をありがとう値+1:4ですか? – akrun

答えて

1

ない効率的な答え:ちょうど試みる

logic:私は最初の4を抽出するためrbindながら4に長さを延長(X/Y/ZがLENGTH4のlareadyが既に場合は、例外はあり得ます)要素。

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

何意志を動作するか確認してください、以下のソリューションを投稿、編集のためにjoel.wilson @ –

+0

私は長さ4のbcozを作るために現在の長さを拡張しています。各ベクトル 'x/y/z'が長さ4になるようにします。右 –

+0

右、それを得ました!私はそれを試してみましょう –

0

は、プログラムstringiから

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をこれを行うためのオプションです。

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) 
関連する問題