1

あまりにも多くのループを使用せずに R でこのプロセスをベクトル化する方法は?

私はこの機能を持っています:

HM=function(CO,CS,CD,CSD){
  if(CO-CS)>1){
    return(2^(CS)/(2^(CO)-2^(CSD)))
  }
  else if(CO-CD)>1){
    return(1-2^(CD)/(2^(CO)-2^(CSD)))
  }
return(0)
}

基本的に、これらの値に対する {CO,CS,CD,CSD} のすべての組み合わせの HM 値を取得する必要があります。

CO  25.76031685 25.71126747 25.90163231
CS  24.40528297 24.09929848 23.51999092
CD  25.99405861 25.72906113 25.61374474
CSD 35.94195557 36.07263184 34.00024414

だから私はそれらの値を取得する必要があります:

HM(25.76031685,24.40528297,25.99405861,35.94195557)
HM(25.71126747,24.40528297,25.99405861,35.94195557)
HM(25.90163231,24.40528297,25.99405861,35.94195557)
HM(25.76031685,24.09929848,25.99405861,35.94195557)
HM(25.71126747,24.09929848,25.99405861,35.94195557)
HM(25.90163231,24.09929848,25.99405861,35.94195557)
HM(25.76031685,23.51999092,25.99405861,35.94195557)
HM(25.71126747,23.51999092,25.99405861,35.94195557)
HM(25.90163231,23.51999092,25.99405861,35.94195557)
etc...

基本的には、3 つの要素の 4 つのベクトルとのすべての組み合わせです。

Vectors :
a=c(1,2,3)
b=c(1,2,3)
c=c(1,2,3)
d=c(1,2,3)

Combinations :
1,1,1,1
2,1,1,1
1,2,1,1
1,1,2,1
1,1,1,2
3,1,1,1
1,3,1,1
etc...

組み合わせ数の数え方がわかりません。もちろん、4 つのネストされたループを使用することもできますが、R はループに対して遅すぎるため、ベクトル化でそれを行う方法を学びたいと考えています。expand.grid を使用できると思いますが、方法がわかりません。また、テーブルはExcelにあり、.csvでエクスポートできますが、このようなものを実装する最良の方法がわからないので、助けてくれてありがとう!

4

2 に答える 2

1

この場合、これらの値にはどの条件も当てはまらず、すべてゼロが返されるため、答えはあまり面白くありません。

> tdat  #  dataframe version of that data.
         CO       CS       CD      CSD
V2 25.76032 24.40528 25.99406 35.94196
V3 25.71127 24.09930 25.72906 36.07263
V4 25.90163 23.51999 25.61374 34.00024
> with( tdat, 
       ifelse( (CS-CO) > 1, 2^(CS)/(2^(CO)-2^(CSD)),  #1st consequent
                 ifelse ( (CD-CO) > 1, 1-2^(CD)/(2^(CO)-2^(CSD)), # 2nd
                                           0) ) )  # default
[1] 0 0 0

そのデータのマトリックス バージョンでそれを行うには、最初にコード内の不一致のかっこを修正してから、行名で単一の渡されたx値を参照しながら適用を使用する必要があります。

mdat <- 
structure(c(25.76032, 24.40528, 25.99406, 35.94196, 25.71127, 
24.0993, 25.72906, 36.07263, 25.90163, 23.51999, 25.61374, 34.00024
), .Dim = c(4L, 3L), .Dimnames = list(c("CO", "CS", "CD", "CSD"
), NULL))

> apply(mdat, 2, function(x){
+   if( (x['CS']-x['CO'])>1){
+     return(2^(x['CS'])/(2^(x['CO'])-2^(x['CSD'])))
+   }
+   else if( (x['CD']-x['CO'])>1){
+     return(1-2^(x['CD'])/(2^(x['CO'])-2^(x['CSD'])))
+   }
+ return(0)
+ })
[1] 0 0 0
于 2013-06-21T22:41:10.193 に答える