2014-05-19 125 views
2

我試圖通過使用文檔化的應用函數來避免循環,但一直未能找到任何適合我的目的的示例。我有兩個向量,X,它是(1個XP)和ÿ,它是(1個XQ),並希望它們的參數的笛卡爾乘積送入一個函數,這裏是一個簡約例子:將函數應用於兩個不等向量的笛卡爾乘積

require(kernlab) 
    x = c("cranapple", "pear", "orange-aid", "mango", "kiwi", 
      "strawberry-kiwi", "fruit-punch", "pomegranate") 
    y = c("apple", "cranberry", "orange", "peach") 

    sk <- stringdot(type="boundrange", length = l, normalized=TRUE) 
    sk_map = function(x, y){return(sk(x, y))} 

我意識到我可以在一個維度上使用apply函數,爲另一個維度使用循環,但是我覺得必須有一種方法可以一步完成......任何想法?

回答

1

這是你腦子裏想的是什麼:

sk <- stringdot(type="boundrange", length = 2, normalized=TRUE) 

# Create data frame with every combination of x and y 
dat = expand.grid(x=x,y=y) 

# Apply sk by row 
sk_map = apply(dat, 1, function(dat_row) sk(dat_row[1],dat_row[2])) 
+0

'apply'只會工作時x'的'數據類型和'y'是相同的(或者它是否可以強迫他們是相同的)。更常見的情況是'mapply(fn,dat [[1]],dat [[2]]))' – MrFlick

+0

在這種情況下,函數比較字符串匹配子字符串,所以我不認爲這會有問題這裏(例如,如果一列是一個因子或字符而另一列是數字,則該函數可以正常工作),但這很重要,以備將來參考。 – eipi10

+0

對,在這種情況下,它會工作。但是,由於問題的標題提出了一個更一般的解決方案,我想確保它也包含在內。 – MrFlick

1

可以使用outer功能這一點,如果你的函數被矢量,並且可以使用Vectorize函數來創建一個量化的功能,如果它不是。

outer(x,y,FUN=sk) 

outer(x,y, FUN=Vectorize(sk)) 
+0

我喜歡簡單,謝謝! – mlegge