2

m1、m2、m3、m4、m5、および m6 の半ダースのマトリックスがあります。簡単な例のために、次のように見えるとしましょう。

m1<- matrix(1:10, 2, 5)
m2<- matrix(11:20, 2, 5)
m3<- matrix(21:30, 2, 5)
m4<- matrix(31:40, 2, 5)
m5<- matrix(41:50, 2, 5)
m6<- matrix(51:60, 2, 5)

最終的に、関数を 6 つすべてに適用したいと思います。

f(m1,m2,m3,m4,m5,m6)

マトリックスの数はスクリプトを実行するたびに変わるため、これをプログラムで行う方法を探しています。私の最初の方法は、次の機能を実行することでした。

paste("m",1:6,sep="")

上記の式は文字列を返しました。

[1] "m1" "m2" "m3" "m4" "m5" "m6"

行列の名前ではなく値を見つけるために、次の関数を使用して、ミックスに「get」を追加してみました。

get(paste("m",1:6,sep=""))

しかし、「get」式は m1 の値のみを返し、必要なものはすべて無視しました。そこで、for ループをいじり始めました。

for(k in 1:6){
if(k == 1){b<- paste("m",k,sep="")}
else{b<- c(b, paste("m",k,sep=""))}
}

> b
[1] "m1" "m2" "m3" "m4" "m5" "m6"

これは、最初の試行で取得した文字列と同じです。その結果、次の式は失敗しました。

w<- f(b)

私も試しました:

w<- f(get(b))

ある程度予想通り、R は m1 を行列として認識しましたが、B の残りの項は無視しました。

私も試しました:

w<- f(get(b[1:6]))

これを行うと、上記と同じ結果が得られます。

最後に、 b をリストに変えてみました:

b<- list(m1,m2,m3,m4,m5,m6)

私は lapply(b, g) を使用したいと思っていましたが、lapply に配置すると関数 (私が書いたわけではなく、使用する義務があります) が正しく動作しません。

この一見単純なタスクをどのように達成できるかについて、他に何か考えはありますか? 私はまだRに比較的慣れていないので、私が知らないよく知られたアプローチがあるかもしれませんが、既存のドキュメントを検索しても何も見つかりませんでした。この小さい。その助けのためにフォーラムに乾杯.

4

3 に答える 3

2

行列をリストに保存しl = list(m1,m2,m3,m4,m5,m6)、を使用しますdo.call(f, l)

于 2013-03-20T18:46:34.543 に答える
2

これについて間違った方法で行っている可能性があります。行列をリストに入れてからlapply、関数fをのすべての要素に入れますlist

m1<- matrix(1:10, 2, 5)
m2<- matrix(11:20, 2, 5)
m3<- matrix(21:30, 2, 5)
m4<- matrix(31:40, 2, 5)
m5<- matrix(41:50, 2, 5)
m6<- matrix(51:60, 2, 5)

f<-function(x) sum(x) # A test function
l<-list(m1,m2,m3,m4,m5,m6)
lapply(l,f)

それは問題ないと言うかもしれませんが、何千もの行列があるとどうなりますか? そのリストを作成するにはどうすればよいですか? ほとんどの場合、 を生成するmatricesか、最初からリストに読み込むことができます。それらをリストとして生成する方法は次のとおりです。

start<-seq(1,51,by=10)
gen<-function(x) matrix(x:(x+9),2,5)
l<-lapply(start,gen)

通常、変数の名前を反復処理することを考え始めると、それは間違っています。私の経験からすると、これはほとんどのプログラミング言語に当てはまります。

于 2013-03-20T18:23:33.823 に答える
1

試す

m1 <- matrix(1:4, ncol=2) # some dummy matrices
m2 <- m1*2
m3 <- m2+2
m4 <- m1*3


b <- paste0('m', 1:4)
b

for(i in 1:length(b)) {
 print( get(b[i]) )
  }

または使用してlapply

lapply(b, get)
于 2013-03-20T18:23:07.027 に答える