结合R中的两个列表

Combining two list in R

我有两个列表 l1l2,我想将它们组合起来看起来像 expected,并使用 lapply 获取平均值。我希望它更有效,这样我就不必每次都输入值,因为我想将它用于更大的列表。什么可能是完成此任务的更好方法?

l1 <- list(1,2,3,4,5)
l2 <- list(6,7,8,9,10)

expected <- list(c(1,6), c(2,7), c(3,8), c(4,9), c(5,10))
lapply(expected, mean)

谢谢!

我们可以用Map连接(c)得到mean

Map(c, l1, l2)
mapply(\(x, y) mean(c(x, y)), l1, l2)
[1] 3.5 4.5 5.5 6.5 7.5

或者不是在循环中执行此操作,unlist list 到向量,cbindmatrix 并得到 rowMeans

rowMeans(cbind(unlist(l1), unlist(l2)))
[1] 3.5 4.5 5.5 6.5 7.5

或者可以使用 pmean 来自 kit

library(kit)
pmean(unlist(l1), unlist(l2))
[1] 3.5 4.5 5.5 6.5 7.5

另一种可能的解决方案:

rowMeans(do.call(rbind, Map(data.frame, A=l1, B=l2)))

#> [1] 3.5 4.5 5.5 6.5 7.5

或使用purrr::map2_dbl:

library(purrr)

map2_dbl(l1, l2, ~ mean(c(.x, .y)))

#> [1] 3.5 4.5 5.5 6.5 7.5

另一个选择是在两个列表上使用一个简单的公式(根据下面的基准,这比 pmean 稍快):

(unlist(l1) + unlist(l2))/2

# [1] 3.5 4.5 5.5 6.5 7.5

基准

为了确定最快的速度,我创建了一个稍大的数据集,其中包含两个列表,每个列表的长度均为 1,000。然后,我比较了目前发布的所有方法。

l1 <- map(lapply(seq(1, 1000, 1), list), 1)
l2 <- map(lapply(seq(11, 1010, 1), list), 1)

-代码

bm <- microbenchmark::microbenchmark(Map = lapply(Map(c, l1, l2), mean),
                               mapply = mapply(\(x, y) mean(c(x, y)), l1, l2),
                               rowMeans = rowMeans(cbind(unlist(l1), unlist(l2))),
                               pmean = pmean(unlist(l1), unlist(l2)),
                               rowMeans_Paul = rowMeans(do.call(rbind, Map(data.frame, A=l1, B=l2))),
                               map2_dbl = map2_dbl(l1, l2, ~ mean(c(.x, .y))),
                               unlist_baseR = (unlist(l1) + unlist(l2))/2,
                               times = 1000)