3

(編集注:ソリューションをより適切に反映するために、タイトルを「R:行列の列の組み合わせを列挙する」から「Rgrep:文字列の行列をリストに一致させる」に変更しました)

文字列の行列をリストに一致させようとしています。これにより、後の操作で最終的に行列をマップとして使用できるようになりdata.frameます。

この最初の部分は意図したとおりに機能し、可能なすべてのペア、トリプル、およびクワッドの組み合わせのリストを返します(おそらく、このアプローチによってバインドが作成されましたか?):

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))

getTrades <- function(dd, Maxleg=3)
{
    nodes <- colnames(dd)
    tradeList <- list()
    for (i in 2:Maxleg){
        tradeLeg <- paste0('legs',i)
        tradeList[[tradeLeg]] <- combn(nodes, i)
    }
    return(tradeList)
}

tradeCombos <- getTrades(priceList, 4)

ここで、この可能な組み合わせのリストをトレードに変えたいと思います。例えば:

> tradeCombos[[1]][,1]
[1] "aaa" "bbb"

最終的には、などになる必要がpriceList[,2] - priceList[,1]あります。

私は、および同様のコマンドを使用していくつかのアプローチを試しgrepましたが、次のことに近づいたと感じています。

LocList <- sapply(tradeCombos[[1]], regexpr, colnames(priceList))

ただし、この形式は次のステップにはあまり適していません。

理想的には、LocList[1]次のようなものを返します。1 2

と仮定しtradeCombos[[1]][,1] == "aaa" "bbb"ます。

誰か助けてもらえますか?

__

以下のすべての答えの助けを借りて、私は今持っています:

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

getTrades <- function(dd, Maxleg=3)
{
    tradeList <- list()
    for (i in 2:Maxleg){
        tradeLeg <- paste0('legs',i)
        tradeLegsList <- combn(names(dd), i, 
            function(x) dd[x], simplify = FALSE)
        nameMtx <- combn(names(dd), i)
        names(tradeLegsList) <- apply(nameMtx, MARGIN=2, 
            FUN=function(x) paste(rev(x), collapse='*'))
        tradeList[[tradeLeg]] <- lapply(tradeLegsList, colDiff) 
    }
    return(tradeList)
}

tradeCombos <- getTrades(priceList, 4)

これは構成部品の名前を保持し、私が達成しようとしていたすべてです。

助けてくれたすべての人に感謝します。

4

3 に答える 3

3

おっと...以下のすべてを無視して、更新にジャンプします

私のコメントで述べたように、あなたはただ使うことができますcombn。このソリューションでは、最後のステップに進むことはできませんが、代わりにのリストが作成されますdata.frames。そこからlapply、最終ステップが何であれ、それを使用して簡単に到達できます。

簡略化された関数は次のとおりです。

TradeCombos <- function(dd, MaxLeg) {
  combos = combn(names(dd), MaxLeg)
  apply(combos, 2, function(x) dd[x])
}

これを使用するには、データセットと探している組み合わせの数を指定するだけです。

TradeCombos(priceList, 3)
TradeCombos(priceList, 4)

次に進む:@mplourdeはReduce、連続して減算するために使用する方法を示しています。ここでも同様のアプローチが取られます。

cumDiff <- function(x) Reduce("-", rev(x))
lapply(TradeCombos(priceList, 3), cumDiff)

TradeCombos関数の出力をsとして保持することによりlistdata.frame柔軟性の余地を残すことができます。たとえば、行の合計が必要な場合は、単にlapply(TradeCombos(priceList, 3), rowSums);を使用できます。適用したい機能についても、同様のアプローチをとることができます。

アップデート

@GSeeがこれを回答として追加しなかった理由はわかりませんが、かなり素晴らしいと思います。

list次のようにdata.framesを取得します。

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

必要に応じて進めます。(たとえば、cumDiff作成した関数を使用します:combn(names(priceList), 2, function(x) cumDiff(priceList[x]), simplify = FALSE)。)

于 2012-09-11T17:20:55.487 に答える
2

lapplyこれは、、、applyおよびを使用して最終的な目的を取得しますReduce

lapply(tradeCombos, 
 function(combos) 
 apply(combos, MARGIN=2, FUN=function(combo) Reduce('-', priceList[rev(combo)])))

comboのコンボ行列の1つからの列ですtradeCombosrev(combo)列を反転して、最後の値が最初になるようにします。aから列のサブセットを選択するためのR構文はdata.frameです。逆の順序で、の列のみを含むのサブセットもです。sは実際には単なる列のsであるため、sを反復処理するように設計された関数は、の列を反復処理するために使用できます。そのような機能の1つです。関数(この場合は減算関数)と引数のaを取り、前の呼び出しの結果を使用して、の引数で関数を連続して呼び出します(例:((arg1-arg2)-arg3)-arg4)。DF[col.names]priceList[rev(combo)]priceListcombodata.framelistlistdata.frameReduceReduce-listlist

の列の名前を変更しtradeCombosて、最終的な列名がソースを反映するようにします。

tradeCombos <- lapply(tradeCombos, 
    function(combos) {
        dimnames(combos)[[2]] <- apply(combos, 
            MARGIN=2, 
            FUN=function(combo) paste(rev(combo), collapse='-')
        )
        return(combos)
    }
)
于 2012-09-11T11:47:04.810 に答える
1

tradeCombos要素list付きです。matrixしたがって、tradeCombos[[1]]がより適しているmatrixのです。apply

apply(tradeCombos[[1]],1,function(x) match(x,names(priceList)))
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    1    6
 [6,]    1    7
 [7,]    2    3
 [8,]    2    4
 [9,]    2    5
[10,]    2    6
[11,]    2    7
[12,]    3    4
[13,]    3    5
[14,]    3    6
[15,]    3    7
[16,]    4    5
[17,]    4    6
[18,]    4    7
[19,]    5    6
[20,]    5    7
[21,]    6    7

ちなみに、とにかく文字列形式を使用してサブセット化できます。priceList[,"aaa"]

于 2012-09-11T11:44:41.153 に答える