1

data.framesのリストがあり、さまざまな重みを使用してそれらの列を操作したいと思います。

たとえば、2番目の列から最初の列を減算します(解決済み、以下を参照)。または、2番目の2倍から1番目と3番目を減算します(未解決)。

この質問に答えて得られた寛大な助けのおかげで、私はを使用して重みなしで2次元で問題の解決策を持っていますReduce

ウェイトを使って、そしてより高い次元で操作できる柔軟性が欲しいです。

私がこれまでに持っているのは:

priceList <- data.frame(aaa = rnorm(100, 100, 10), bbb = rnorm(100, 100, 10), 
                        ccc = rnorm(100, 100, 10), ddd = rnorm(100, 100, 10), 
                        eee = rnorm(100, 100, 10), fff = rnorm(100, 100, 10), 
                        ggg = rnorm(100, 100, 10)
                        )

colDiff <- function(x) 
    {
        Reduce('-', rev(x))
    }

tradeLegsList <- combn(names(priceList), 3, function(x) priceList[x], simplify = FALSE)

tradeList <- lapply(tradeLegsList, colDiff)

私の知る限り、Reduce複数の議論をするようには設計されていません。

私はこれを長い道のりで、そしていくつかのループで行うことができますが、それはRの方法の2* tradeLegsList[[1]]$bbb - tradeLegsList[[1]]$aaa - tradeLegsList[[1]]$cccようには見えません。

重みベクトルを渡す方法はありますか?

w = c(-1, 2, -1)理想的には、colDiff(または)関数などの引数を渡しReduceます...または同様のものです。

4

1 に答える 1

3

確かReduceに、複数の引数を許可するようには調整されていません。各削減に対して2つだけです。したがって、リスト内の要素を事前に乗算するのが最も簡単ですReduce

以下は、関数定義mapply内でこれを行うソリューションです。colDiff

colDiffの定義を変更して重みベクトルを許可し、withを使用mapply してこれを適用しますSIMPLIFY = F

編集

コメントに照らして、均等化は列の数に依存し、rev

長さによる重み付け

length(x)== 1-> w = 1
length(x)== 2-> w = c(-1、1)、
length(x)== 3-> w = c(-1、2、- 1)、
length(x)== 4-> w = c(-1、1、-1、+ 1)

weighting <- function(i){
  switch(i, 1, c(-1,1), c(-1,2,-1), c(-1,1,-1, 1))
}
colDiff <- function(x) 
    {
        w = weighting(length(x))
        Reduce('+', mapply('*', x, e2 = w, SIMPLIFY = F))
    }

次に、このようなものが機能します

tradeList <- lapply(tradeLegsList, colDiff)

関数型プログラミングのテーマを維持して、Mapでの単純なラッパーであるmapply使用することもできます。SIMPLIFY = F

colDiff <- function(x) 
        {
            w = weighting(length(x))
            Reduce('+', Map('*', x , e2 = w))
        }

関数colDiff内で重み付けを事前に調整することもできます(これは簡単な場合があります)。 weighting[[2]]は、2列のweighting[[3]]場合、3列の場合の重み付けです。

colDiff <- function(x) 
        {
         weighting <- list(1, c(-1,1), c(-1,2,-1), c(-1,1,-1, 1))             
            w = weighting[[length(x)]]
            Reduce('+', Map('*', x , e2 = w))
        }
于 2012-09-12T04:42:40.220 に答える