使用mapply计算多个列表的平均值

3
数据集
firstList  <- list(a = 1:3, b = 4:6)
secondList <- list(c = 7:9, d = 10:12)

我正在尝试使用mapply计算多个列表的平均值。

mapply(mean, firstList, secondList)

它没有起作用,是因为mean只会按照其第一个参数的平均值进行计算,如在矩阵上使用mapply和mean函数中所述。

以下代码可以正常工作:

mapply(mean, firstList)
mapply(mean, secondList)

我随后尝试使用lapply将一个列表一次传递给mapply

lapply(c(firstList, secondList), function(x) mapply(mean, x))

输出结果不是平均值,而是单独的列表。

我需要知道如何使用 mapply 计算多个列表的平均值。我也希望能解释一下为什么 mapply 没有返回列表的平均值。

非常感谢。

1个回答

3
根据 ?mean ,其使用方法如下:
mean(x, ...)

mapply中,我们有'x'和'y',因此我们可以将相应的list元素连接起来形成一个单独的'x',然后取平均值。
mapply(function(x,y) mean(c(x,y)), firstList, secondList)
#a b 
#5 8 

同上,

mean(c(1:3, 7:9))
#[1] 5

如果我们正在使用一些apply函数,我们可以使用Map连接它们,然后使用sapply循环list元素来获取其mean
sapply(Map(c, firstList, secondList), mean)
# a b 
#5 8 

如果list元素的长度相同,我们可以使用colMeans作为mapply/c的输出是一个matrix而不需要SIMPLIFY=FALSE

colMeans(mapply(c, firstList, secondList)) 
#a b 
#5 8 

非常感谢,您是说函数的参数数量必须等于要求平均值的列表数量,对吗? - Ragy Isaac
1
@RagyIsaac 这与 mean 中的参数有关,它只能接受 x,而使用 mapply/Map,您可以根据列表数量拥有 x、y 等。此外,如果有许多列表,而不是指定 function(x,y,z, u)...,您可以使用 c 来连接所有相应的列表元素,然后使用 sapply 获取 mean 或者如果长度相同,则使用 colMeans - akrun
1
@RagyIsaac 另一个选项是 library(data.table); rbindlist(list(firstList, secondList))[, lapply(.SD, mean)] - akrun
为什么 lapply(c(firstList, secondList), function(x) mapply(mean, x)) 没有生效? - Ragy Isaac
1
@RagyIsaac 如果你看一下 c(firstList, secondList) 的输出,它是一个长度为 4 的列表。lapply 将循环遍历列表元素。每个列表元素都是一个向量。在该向量上应用 mapply 就像再次循环每个单个向量元素,而进行 mean 就是对单个值进行 mean - akrun
1
如果您想在连接后计算每个列表元素的平均值,可以使用 lapply(c(firstList, secondList), function(x) mapply(mean, list(x))) 或者 lapply(c(firstList, secondList), mean) - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接