2012-09-14 26 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)