Использование mapply для вычисления среднего значения более чем одного списка

Набор данных

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

Я пытаюсь вычислить среднее значение нескольких списков с помощью mapply.

mapply(mean, firstList, secondList)

Это не сработало, потому что mean усредняет только свой первый аргумент согласно Использование mapply с функция среднего на матрице

Это работает правильно:

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

Затем я попытался lapply предоставлять по одному списку mapply

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

Результат был НЕ средним, а отдельными списками

Мне нужно, как вычислить mean из нескольких списков с помощью mapply. Я также был бы признателен за объяснение, почему mapply не вернул списки "mean"

Спасибо заранее


person Ragy Isaac    schedule 19.09.2015    source источник


Ответы (1)


Согласно ?mean, использование

mean(x, ...)

В mapply у нас есть 'x' и 'y', поэтому мы можем объединить соответствующие элементы list, чтобы образовать один 'x', а затем взять mean

mapply(function(x,y) mean(c(x,y)), firstList, secondList)
#a b 
#5 8 

такой же как,

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

Если мы используем комбинацию apply функций, мы можем объединить с Map, а затем зациклить элементы list с sapply, чтобы получить mean

sapply(Map(c, firstList, secondList), mean)
# a b 
#5 8 

Или, если lengths из list элементов одинаковы, мы можем использовать colMeans, поскольку результат mapply/c - это matrix без SIMPLIFY=FALSE

colMeans(mapply(c, firstList, secondList)) 
#a b 
#5 8 
person akrun    schedule 19.09.2015
comment
Большое спасибо, вы говорите, что количество параметров функции должно равняться количеству списков для усреднения, верно? - person Ragy Isaac; 19.09.2015
comment
@RagyIsaac Это связано с аргументами в mean, которые могут принимать только x, где, как и в случае mapply/Map, у вас есть x, y, ... в зависимости от количества списков. Кроме того, если списков много, вместо указания function(x,y,z, u)... вы можете просто использовать c для объединения всех соответствующих элементов списка, а затем получить mean с sapply или использовать colMeans, если длины одинаковы. - person akrun; 19.09.2015
comment
@RagyIsaac Другой вариант - library(data.table); rbindlist(list(firstList, secondList))[, lapply(.SD, mean)] - person akrun; 19.09.2015
comment
Почему lapply (c (firstList, secondList), function (x) mapply (mean, x)) не работает? - person Ragy Isaac; 19.09.2015
comment
@RagyIsaac Если вы посмотрите на вывод c(firstList, secondList), это список длины 4. lapply будет проходить через элементы списка. Каждый элемент списка - это вектор. Применение mapply к этому вектору похоже на повторение цикла каждого отдельного элемента вектора, а выполнение mean - это просто выполнение mean одного значения. - person akrun; 19.09.2015
comment
@RagyIsaac Если вы хотите получить среднее значение каждого элемента списка после конкатенации, lapply(c(firstList, secondList), function(x) mapply(mean, list(x))) или просто lapply(c(firstList, secondList), mean) - person akrun; 19.09.2015