2013-10-05 66 views
0

我有一個數據集dat和兩個列表xy。我想計算xy的不同組合,其值爲k。我寫了下面的代碼來查找這些不同組合的函數fun的值。但我怎樣才能得到k價值最大化功能fun這些不同的組合?因爲在每次迭代中,我有不同的列表xy,最後我想找到最大化函數funk找到兩個列表中哪個組合最大化的最快方法R

dat = c(9, 2, 7) 
    k = seq(0, 1, length = 10) 
    x =list(a = 1, b = 8, c = 4) 
    y = list(a = .5, b = 5, c = 5) 
    matrix = cbind(unlist(x), unlist(y)) %*% rbind(1-k, k) 
    z = apply(matrix, 2, as.list) 
    fun = function(dat, vec) sum(vec$a * dat - vec$b * dat + vec$c * dat) 
    res = rep(0, length(k)) 
    for (i in 1:(length(k))){ 
     v = split(unlist(z[[i]]), sub("\\d+$", "", names(z[[i]]))) 
     res[i] = fun(dat, v) 
    } 

    > res 
    [1] -54 -47 -40 -33 -26 -19 -12 -5 2 9 

在這個例子中,k = 10,但我怎樣才能找到沒有循環的每個不同的列表?

+0

你可以使用'mapply',儘管我不確定在這種情況下如何 - 如果它更清楚你想要做什麼,這可能會簡化很多! –

+0

我想創建(1-k)x + ky的所有組合,然後計算每個組合的函數樂趣。然後找到哪個k最大化功能「樂趣」。 – rose

回答

0

我仍然不能使你正在嘗試做的正面或反面的,但你的代碼似乎歸結爲這樣:

colSums(matrix(rep(dat,nrow(matrix)),ncol=nrow(matrix)) %*% (matrix*c(1,-1,1))) 

這將在k任何大小的工作。它也不需要你的任何names

一些建議:當一個簡單的向量可以使用時,不要使用list。您似乎瞭解%*%乘法的工作原理,您只需要將矩陣轉換爲正確的格式即可。

+0

感謝您的回覆。我怎樣才能得到哪個k獲得了函數樂趣的最大值? – rose

相關問題