4

我有一个股票/ETF 符号向量,其大小取决于我的兴趣。

前任:

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

我想使用组合规则,一次两个迭代向量,生成对。

前任:

p <- combn(symbols_v, 2)

然后,p 中的每一对都应传递到(用户定义的)两个参数函数“ 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似乎是你要找的。它允许您提供一个函数和多个输入 - 然后它将为函数使用每个输入的第一个元素,然后是输入的第二个元素,依此类推。

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 回答