我希望将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)
答案 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(...)
。