3

行列の各行または列に関数を適用しようとしていますが、行ごとに異なる引数値を渡す必要があります。

lapply や mapply などに精通していると思っていましたが、おそらく十分ではありません。

簡単な例として:

> a<-matrix(1:100,ncol=10);
> a
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11   21   31   41   51   61   71   81    91
 [2,]    2   12   22   32   42   52   62   72   82    92
 [3,]    3   13   23   33   43   53   63   73   83    93
 [4,]    4   14   24   34   44   54   64   74   84    94
 [5,]    5   15   25   35   45   55   65   75   85    95
 [6,]    6   16   26   36   46   56   66   76   86    96
 [7,]    7   17   27   37   47   57   67   77   87    97
 [8,]    8   18   28   38   48   58   68   78   88    98
 [9,]    9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100

各行に関数を適用したいとしましょう。

apply(a, 1, myFunction);

ただし、私の関数は引数を取るため、次のようになります。

apply(a, 1, myFunction, myArgument);

しかし、引数が行ごとに異なる値を取るようにしたい場合、それを行う正しい方法を見つけることができません。複数の値を持つ 'myArgument' を定義すると、ベクトル全体が明らかに 'myFunction' の各呼び出しに渡されます。

apply と多変量 mapply の間の一種のハイブリッドが必要になると思います。それは理にかなっていますか?

私の目標を達成するための「汚い」方法の1つは、マトリックスを行(または列)で分割し、結果のリストでmapplyを使用して、結果をマトリックスにマージすることです:

do.call(rbind, Map(myFunction, split(a,row(a)), as.list(myArgument)));

スイープ、集計、すべての *apply バリエーションを見てみましたが、私のニーズに完全に一致するものは見つかりませんでした。私はそれを逃しましたか?

ご協力ありがとうございました。

4

3 に答える 3

0

素晴らしい答えはないと思いますがmapply、関数が常に同じサイズのベクトルを返すと仮定すると、「rbind」部分を処理する を使用してソリューションをいくらか単純化できます (また、Map実際には ですmapply):

a <- matrix(1:80,ncol=8)
myFun <- function(x, y) (x - mean(x)) * y
myArg <- 1:nrow(a)

t(mapply(myFun, split(a, row(a)), myArg))
于 2014-11-07T21:37:40.360 に答える