Используйте mapply и сохраните структуру исходного списка


У меня есть список "temp", который равен

[[1]]
[1] 8 0 3

[[2]]
[1] 6 4 0

[[3]]
[1] 0 5 0

И вектор vec = c(1,2,3,4,5,6,7,8,9). Я хочу получить список. с такой же структурой, как "temp", которая будет содержать максимум для каждого элемента между temp и vec. Желаемый новый список будет равен

[[1]]
[1] 8 2 3

[[2]]
[1] 6 5 6

[[3]]
[1] 7 8 9 

Если я выполню

mapply(max, temp, vec)

Я получаю

8 6 5 8 6 6 8 8 9
Что является неправильным результатом и неправильной структурой.

А если я выполню

lapply(temp, function(x) mapply(max, unlist(temp), vec))

Я получаю следующее

[[1]]
[1] 8 2 3 6 5 6 7 8 9

[[2]]
[1] 8 2 3 6 5 6 7 8 9

[[3]]
[1] 8 2 3 6 5 6 7 8 9

Это в некотором смысле правильно. результат с неправильной структурой. Существует ли векторизованный способ получить желаемый эффект? Это важно для этого нужно бежать очень быстро...

Спасибо!!!

1 2

1 ответ:

temp <- list(c(8,0,3),c(6,4,0),c(0,5,0))
vec <- c(1,2,3,4,5,6,7,8,9)

Используя размеры списка temp, Вы можете разделить и сравнить:

Map(pmax, temp, split(vec, rep(seq_along(temp),sapply(temp,length))))

...или сравнить и разделить:

split( pmax(unlist(temp),vec), rep(seq_along(temp),sapply(temp,length)) )

..или просто для того, чтобы показать, что есть миллион способов сделать все:

split(sweep(do.call(rbind,temp),2:1,vec,FUN="pmax"),1:length(temp))

Результат:

[[1]]
[1] 8 2 3

[[2]]
[1] 6 5 6

[[3]]
[1] 7 8 9