4

私は株式/ETF シンボルのベクトルを持っていますが、これは興味に応じてサイズが異なります。

元:

symbols_v <- c('UPRO','TLT','SPXU','TBT','DRN','URE','SOXL')

組み合わせのルールを使用して、一度に 2 つずつベクトルを反復処理し、ペアを生成したいと思います。

元:

p <- combn(symbols_v, 2)

p からの各ペアは、(ユーザー定義の) 2 つのパラメーター関数 " " に渡されますf(x,y)。この関数は、株式データをダウンロードし、相関およびその他の関数を実行します。

私の質問は次のとおりです。1) 以下のステップ 2 で p に使用するのに最適なデータ構造は何ですか? 2) データ構造 p が与えられた場合、それを解析してペアを関数 f に渡す最も簡単な方法は何ですか?

combn()まとめ: 関数の結果を取得し、各ペアを関数に渡すにはどうすればよいf(x,y)ですか?

Rでは「遅い」と見なされるため、ループを最小限に抑えようとしています。

私はおそらく何か基本的なことを見逃していますが、それについて頭を悩ませているようには見えません。

答えを提供しながら、私の知性を侮辱してください:)

4

4 に答える 4

10

FUN次の引数を使用できますcombn

library(quantmod)  # for getSymbols
symbols_v <- c('UPRO','TLT','SPXU')  # shorter example
# simple function to download data and calculate correlation between close prices
f <- function(x) {
  x1 <- getSymbols(x[1], auto.assign=FALSE)
  x2 <- getSymbols(x[2], auto.assign=FALSE)
  y <- merge(Cl(x1),Cl(x2))
  cor(y[,1],y[,2],use="complete.obs")
}
# run 'f' on each pair 
p <- combn(symbols_v, 2, FUN=f, simplify=FALSE)

[[1]]
            TLT.Close
UPRO.Close -0.6394617

[[2]]
           SPXU.Close
UPRO.Close  0.0947242

[[3]]
           SPXU.Close
TLT.Close -0.06216682
于 2012-09-14T15:38:04.090 に答える
3

mapplyあなたが探しているもののようです。これにより、関数と複数の入力を提供できます。次に、関数の各入力の最初の要素を使用し、次に入力の2番目の要素を使用します。

symbols_v <- c('UPRO','TLT','SPXU','TBT','DRN','URE','SOXL')
out <- combn(symbols_v, 2)

# What you would probably want
mapply(f, out[1,], out[2,])


# Example output
mapply(paste, out[1,], out[2,])
# get rid of names
mapply(paste, out[1,], out[2,], USE.NAMES = FALSE)
# add other parameters to function of interest
mapply(paste, out[1,], out[2,], USE.NAMES = FALSE, MoreArgs = list(sep = "."))

これらの例からの出力:

> mapply(paste, out[1,], out[2,])
       UPRO        UPRO        UPRO        UPRO        UPRO        UPRO 
 "UPRO TLT" "UPRO SPXU"  "UPRO TBT"  "UPRO DRN"  "UPRO URE" "UPRO SOXL" 
        TLT         TLT         TLT         TLT         TLT        SPXU 
 "TLT SPXU"   "TLT TBT"   "TLT DRN"   "TLT URE"  "TLT SOXL"  "SPXU TBT" 
       SPXU        SPXU        SPXU         TBT         TBT         TBT 
 "SPXU DRN"  "SPXU URE" "SPXU SOXL"   "TBT DRN"   "TBT URE"  "TBT SOXL" 
        DRN         DRN         URE 
  "DRN URE"  "DRN SOXL"  "URE SOXL" 
> # get rid of names
> mapply(paste, out[1,], out[2,], USE.NAMES = FALSE)
 [1] "UPRO TLT"  "UPRO SPXU" "UPRO TBT"  "UPRO DRN"  "UPRO URE"  "UPRO SOXL"
 [7] "TLT SPXU"  "TLT TBT"   "TLT DRN"   "TLT URE"   "TLT SOXL"  "SPXU TBT" 
[13] "SPXU DRN"  "SPXU URE"  "SPXU SOXL" "TBT DRN"   "TBT URE"   "TBT SOXL" 
[19] "DRN URE"   "DRN SOXL"  "URE SOXL" 
> # add other parameters to function of interest
> mapply(paste, out[1,], out[2,], USE.NAMES = FALSE, MoreArgs = list(sep = "."))
 [1] "UPRO.TLT"  "UPRO.SPXU" "UPRO.TBT"  "UPRO.DRN"  "UPRO.URE"  "UPRO.SOXL"
 [7] "TLT.SPXU"  "TLT.TBT"   "TLT.DRN"   "TLT.URE"   "TLT.SOXL"  "SPXU.TBT" 
[13] "SPXU.DRN"  "SPXU.URE"  "SPXU.SOXL" "TBT.DRN"   "TBT.URE"   "TBT.SOXL" 
[19] "DRN.URE"   "DRN.SOXL"  "URE.SOXL" 
于 2012-09-14T15:33:41.740 に答える
1

使用できますapply(combn(symbols_v, 2),2,function(x){f(x[1],x[2])})

于 2012-09-14T15:28:37.363 に答える
0

combn呼び出された関数に複数の引数を渡すこともできます。最初の引数が渡されます

fun <- function (x1, x2) someOperation
y <- someData
combn(rnorm(1:10), 2, fun, x2=y)
于 2013-07-22T13:31:29.090 に答える