2013-04-16 7 views
5

複数の行列を作成し、その関数によって得られた値を自動的に特定の行に割り当てる必要があります。行列名が文字列の場合に行列の行に値を代入する方法

EXAMPLE1<-matrix(ncol=4, nrow=16) 
EXAMPLE2<-matrix(ncol=4, nrow=16) 
EXAMPLE3<-matrix(ncol=4, nrow=16) 
EXAMPLE4<-matrix(ncol=4, nrow=16) 


for(i in 1:16){ 
    for(j in 1:4){ 
    paste0("EXAMPLE",j, "[",i,",","]")<- c(1:4) 
    } 
} 

for(i in 1:16){ 
    for(j in 1:4){ 
    get(paste0("EXAMPLE",j)[i,]<- c(1:4) 
    } 
} 

しかしが返され、「割り当ての対象非言語オブジェクトに展開」:私は、私がこれまでに試したものの一例をあげます。だから試しました

for(i in 1:16){ 
    for(j in 1:4){ 
    assign(paste0("EXAMPLE",j, "[",i,",","]"), c(1:4)) 
    } 
} 

これはエラーを返しませんが、値はマトリックスに書き込まれません。最初の行列で

が空である

 [,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] NA NA NA NA 
[3,] NA NA NA NA 
[4,] NA NA NA NA 

とつのループが実行された後(I = 1)Iは、1行が充填(及び第二後に有するように、すべての実施例の行列をexpext - ので、第二行充填ループが終了すると、数字でいっぱいのEXAMPLE行列ができます)。私はペースト機能によってマトリックス名を渡すため

 [,1] [,2] [,3] [,4] 
[1,] 1 2 3 4 
[2,] NA NA NA NA 
[3,] NA NA NA NA 
[4,] NA NA NA NA 

点は、しかし、私はどのように、マトリックスの行に値を割り当てることはありませんされています。名前を文字列にしたい場合は、行列の特定の行に値を割り当てる方法は?どんな助けも素晴らしいだろう。ありがとう

...エディション... 私は非常に明確ではないことを申し訳ありません。私が言及したように、関数の結果(私の行列と同じ数の列を持つことになります)を行列の行に書きたいと思います。各行は、異なる観測に適用された関数からの結果を取ります。同じ変数にいくつかの関数を適用したいので、異なる関数の結果(列番号が異なり、名前が異なる)のためにいくつかの行列があります。行列の番号が付けられ、名前が付けられた方法は、結果を追跡して後で比較するのが最も簡単です。上記の私は行列の列に値を割り当てることができないという問題の例を挙げました。なぜなら、行列の名前を文字列として与えるからです(そうしなければ、番号付けがかなり行われるからです)。だから、一般的に、私は

私はその観察を示すためにマトリックスの名前を生成するためのループと paste0("EXAMPLE", j)を使用して、私なぜjは10から1つのまたはいくつかの他の数字

ザッツを行く

EXAMPLEj[i,]<-SomeFunctionResult 

を行うことができるようにしたいです関数を使用して、その行に結果を格納します。行列はすでに作成されていますが、行列の行に結果を渡す方法はありませんでした。

私はR(およびプログラミング)で新しいので、これを解決するために最悪の方法を選択した可能性があり、そのリストまたは配列ははるかに使いやすくなります。ご回答いただきありがとうございます。

+1

あなたが望む結果が得られますか? –

+0

列に「1,2,3,4」の行列を作成して、それをすべての行について繰り返そうとしていますか? –

+0

あなたは何をしたいのですか? 1つの行列で何をしたいかを見せてください。そして、あなたの変数をリストに入れて、 'do.call'や' lapply'を使って、単一の行列に対して何をするのかを一般化する方が良いと思います。 – agstudy

答えて

2

リストに個々の行列を入れて:リストも命名され、名前でアクセスすることができ

for(i in 1:16){ 
    for(j in 1:4){ 
    EXAMPLE[[j]][i,] <- c(1:4) 
    } 
} 

EXAMPLE <- list(EXAMPLE1, EXAMPLE2, EXAMPLE3, EXAMPLE4) 

はその後、単にインデックスで、このリストには行列にアクセス:

EXAMPLE <- list(EXAMPLE1=EXAMPLE1, EXAMPLE2=EXAMPLE2, 
       EXAMPLE3=EXAMPLE3, EXAMPLE4=EXAMPLE4) 
EXAMPLE[['EXAMPLE1']] 
0

異なるmatriciesを繰り返し処理しようとしているようです。 を呼び出して、与えられた行列の各行を繰り返し処理します。その後、またはmatriciesを反復処理であれば、配列

# create an array of 5 (five) 16x4 matricies: 
EXAMPLE <- array(dim=c(16, 4, 5)) # i changed your four examples to 5, to be clear 

# Have a look at the 5 matricies: 
EXAMPLE 

# TO SELECT A SINGLE MATRIX, SAY EXAMPLE2: 
EXAMPLE[,, 2] # note the two commas 

あなたが反復するループを使用する場合(一般的にお奨めするが、それは単純ではありません -

タスクが反復される場合は、リストを使用して考える必要がありますMARGIN引数が設定した寸法に対応します。また、applyを使用することができます)

for (k in 1:5) # again, using 5 to distinguish 
    for (i in 1:16) 
    EXAMPLE[i, , k] <- i* (1:4) 

EXAMPLE 

。 (すなわち、この場合には、MARGIN==1行のためのものである、列の2および特定のマトリックスのための3

例えば、apply(EXAMPLE, MARGIN=3, FUN=someFunction)は、matriciesの各々に一つずつ機能someFunctionを適用します。

# note the empty [ ] to maintain array properties 
EXAMPLE[ ] <- apply(EXAMPLE, 3, function(M) 1:ncol(M) %x% 1:nrow(M)) 

# have a look at the results 
EXAMPLE 
0

はしようとしています:したがって、上記のあなたの2つの入れ子ループは単一のコード行に入れることができ

上記forループ - つまり 、それははるかにkのように、各行列を反復処理されます2つの行列の違いを表示するには?

> EXAMPLE2 <- matrix(ncol=4, nrow=16, sample(1:10, 4*16, replace=TRUE)) 

> EXAMPLE1 <- EXAMPLE2 
> EXAMPLE1[3,4] <- 99 

> diffs <- ifelse(EXAMPLE1!=EXAMPLE2, EXAMPLE1, "") 
> diffs 
     [,1] [,2] [,3] [,4] 
[1,] "" "" "" "" 
[2,] "" "" "" "" 
[3,] "" "" "" "99" 
[4,] "" "" "" "" 
[5,] "" "" "" "" 
[6,] "" "" "" "" 
[7,] "" "" "" "" 
[8,] "" "" "" "" 
[9,] "" "" "" "" 
[10,] "" "" "" "" 
[11,] "" "" "" "" 
[12,] "" "" "" "" 
[13,] "" "" "" "" 
[14,] "" "" "" "" 
[15,] "" "" "" "" 
[16,] "" "" "" "" 

> print(diffs, quote=FALSE) 
     [,1] [,2] [,3] [,4] 
[1,]      
[2,]      
[3,]    99 
[4,]      
[5,]      
[6,]      
[7,]      
[8,]      
[9,]      
[10,]      
[11,]      
[12,]      
[13,]      
[14,]      
[15,]      
[16,]      
関連する問題