2016-06-21 74 views
0

我想用b1的col1乘以每個列表元素中的每個列表元素並將其存儲在單獨的列中。基本上這是我想要做的:如何將迭代應用的結果相結合

res = 0 
for item in a 
    for col_item in b 
    res = res + item * col_item 

例如,

l1 = list(c('17-Nov-14', 10), c('17-Apr-15', 20)) 
b1 = data.frame(col1 = c(10, 20), res=c(0)) 
result = data.frame(col1= c(10, 20), res = c(2*10+4*10+3*10, 2*20+4*20+3*20)) 

我有一個工作代碼,但可以改進。

test <- function(param, df) { 
    df$res <- as.integer(param[2]) * df$col1 
    df 
} 

t <- lapply(l1, test, b) 
result <- cbind(t[[1]]$col1, t[[1]]$res + t[[2]]$res + t[[3]]$res) 
+1

'b1 $ res < - sum(unlist(l1))* b1 $ col1'? – Psidom

+0

我不能做sum(unlist(l1))。它必須分別處理l1的每個元素。 –

+0

根據你的邏輯,除非你的真實情況與你發佈的不一樣,否則這似乎不那麼重要。 – Psidom

回答

2

我們可以用一個小代數簡化計算。如果我們分解出的b1$col1的元素,那麼我們就可以預先計算列表的總和,並執行鍼對它的矢量乘法:

b1$res <- sum(unlist(l1))*b1$col1; 
b1; 
## col1 res 
## 1 10 90 
## 2 20 180 

對於新問題的定義,我們需要提取所需元素出每個列表組件載體:

b1$res <- sum(as.integer(sapply(l1,`[`,2L)))*b1$col1; 
b1; 
## col1 res 
## 1 10 300 
## 2 20 600 
1

如果你正在尋找一種方法lapply之後,以減少你的列表,你可以使用Reduce功能:

Reduce(function(df1, df2) data.frame(col = df1[1], res = df1[2] + df2[2]), myList) 
# col1 res 
# 1 10 90 
# 2 20 180 

假設myList <- lapply(...)

+0

謝謝。 –