我有一个stock / 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中它被认为是“慢”。
我可能遗漏了一些基本的东西,但我似乎无法完全理解它。
请在提供答案时随意侮辱我的智慧:)
答案 0 :(得分:10)
您可以使用FUN
的{{1}}参数:
combn
答案 1 :(得分: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"
答案 2 :(得分:1)
您可以使用apply(combn(symbols_v, 2),2,function(x){f(x[1],x[2])})
答案 3 :(得分:0)
combn
还允许将多个参数传递给被调用函数。第一个参数将被传递
fun <- function (x1, x2) someOperation
y <- someData
combn(rnorm(1:10), 2, fun, x2=y)