【问题标题】:R - Passing Results of Combn Function to a Two Parameter FunctionR - 将 Combn 函数的结果传递给两个参数函数
【发布时间】:2013-07-22 21:31:29
【问题描述】:

我有一个股票/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 中被认为是“慢”。

我可能遗漏了一些基本的东西,但我似乎无法完全理解它。

请在提供答案时随意侮辱我的智慧:)

【问题讨论】:

  • 我们可以在不提供答案的情况下侮辱您的智力吗? :P
  • @JoshuaUlrich - 我希望我在第一次发布时看到你的评论,不知何故我错过了。它让我发笑。干杯。

标签: r


【解决方案1】:

您可以只使用combnFUN 参数:

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

【讨论】:

  • 我不知道combn。好电话。
  • Joshua - 我仍在努力找出你称之为 x[1]、x[2] 的部分。我在脑海中想到函数“F”必须有两个形式参数。我看到还有很多东西要学。
  • @DougSmith:如果f 有一个参数会更容易。在这种情况下,它是一个长度为 2 的字符向量。如果f 必须有两个参数,那么您将不得不使用mapply 解决方案。
  • @Joshua - 一个长度为 2 的字符向量作为参数?这样说就更有意义了。它还解释了很多关于到目前为止让我感到困惑的文档。这很有帮助。感谢您花时间解释它。
  • @DavidRobinsin - 我很抱歉。我是 Stackoverflow 的新手。感谢您的常见问题解答链接。我已经“接受”了一个解决方案。
【解决方案2】:

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" 

【讨论】:

  • 这个答案似乎更符合我目前的心态和对 R 的理解。谢谢大家的一些非常棒和有用的答案。
【解决方案3】:

您可以使用apply(combn(symbols_v, 2),2,function(x){f(x[1],x[2])})

【讨论】:

  • combn 接受 FUN 参数;你不需要使用apply
【解决方案4】:

combn 还允许将多个参数传递给被调用的函数。第一个参数将被传递

fun <- function (x1, x2) someOperation
y <- someData
combn(rnorm(1:10), 2, fun, x2=y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2021-12-27
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多