如何组合迭代应用的结果

时间:2016-06-21 21:09:56

标签: r

我希望将l1中的每个列表元素与b1的col1相乘,并将其存储在单独的列中。基本上这就是我想要做的事情:

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

E.g。

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)

2 个答案:

答案 0 :(得分: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 :(得分: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(...)