2012-09-14 27 views
4

我有一个stock/etf符号的向量,它的大小因我的兴趣而异。R - 将结合函数的结果传递给双参数函数

例:

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

我想用的组合的规则,每次两个遍历向量,以产生对。

例:

p <- combn(symbols_v, 2) 

从对每对应该然后得到传递到“f(x,y)”一个(用户定义)2层参数的功能,将下载的库存数据和执行相关性等功能。

我的问题是: 1)以下步骤2中用于p的最佳数据结构是什么? 2)给定数据结构p,解析它以便将函数对提供给函数f最简单的方法是什么?

摘要:如何获取combn()函数的结果并将每对函数传递给函数f(x,y)

我试图尽量减少循环,因为这是在R

我可能失去了一些东西基本认为“慢”,但我似乎不能很环绕它我的头。

,同时提供一个答案:)

+0

我们可以侮辱你的智力而不提供答案吗? :P –

+0

@JoshuaUlrich - 我希望在首次发布时看到您的评论,不知何故,我错过了它。它让我发笑。干杯。 –

回答

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" 
+0

这个答案似乎更符合我目前的心态和对R的理解。感谢大家提供一些非常好的和有用的答案。 –

1

请随意侮辱我的智商可以使用apply(combn(symbols_v, 2),2,function(x){f(x[1],x[2])})

+2

'combn'接受一个'FUN'参数;你不需要使用'apply' – GSee

10

你可以只使用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 
+0

我不知道关于combn。好决定。 – Dason

+0

约书亚 - 我仍然试图找出你称为x [1],x [2]的那一段。我的脑海里,功能“F”必须有两个形式参数。我看到还有很多东西需要学习。 –

+0

@DougSmith:如果'f'只有一个参数,那就更简单了。在这种情况下,它是一个长度为2的字符向量。如果'f'必须有两个参数,那么你将不得不使用'mapply'解决方案。 –

0

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

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