结合R中的两个列表
Combining two list in R
我有两个列表 l1
和 l2
,我想将它们组合起来看起来像 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
到向量,cbind
到 matrix
并得到 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)
我有两个列表 l1
和 l2
,我想将它们组合起来看起来像 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
到向量,cbind
到 matrix
并得到 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)