умножить два списка неправильной длины - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть списки типа

a <- list(list(c(-2,1), 4:5, 2:3), list(c(0,2), c(-1,1)))
b <- list(7:9, c(5,-1))

> a
[[1]]
[[1]][[1]]
[1] -2  1

[[1]][[2]]
[1] 4 5

[[1]][[3]]
[1] 2 3


[[2]]
[[2]][[1]]
[1] 0 2

[[2]][[2]]
[1] -1  1



> b
[[1]]
[1] 7 8 9

[[2]]
[1]  5 -1

Я хочу умножить каждое из (-2, 1) с a[[1] на 7 из b[[1]], чтобы получить (-14, 7), каждый из (4, 5) с 8, каждый из (2, 3) с 9, а затем каждый из (0, 2) с 5 и, наконец, каждый из (-1, 1), с -1.

Iможно быть уверенным, что length(a[[i]])==length(b[[i]]) равно TRUE для i = 1,2 (на практике я намного больше), так что есть правильное количество записей для желаемых умножений.

Однако не ясно, сколько записей имеет a[[i]]) (в данном примере 3 для a[[1]] и 2 для a[[2]], или, что эквивалентно, какова длина b[[i]]), за исключениемчто у них будет хотя бы одна запись.Следовательно, преобразование a и b в матрицы не представляется практичным.

Я не уверен, что это имеет отношение к проблеме, но также будет иметь место, что у нас будет столько записей в каждом изa[[i]]) (т.е. 2), как у нас a[[i]]) с.

Я думал о некоторой комбинации do.call и mapply, но не смог заставить ее работать.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Мы действительно можем использовать mapplyMap, что совпадает с mapply, но с SIMPLIFY = FALSE).В зависимости от формата (матрица как в ответе @ RonakShah или список как в вашем вопросе), вы можете использовать

Map(mapply, a, b, MoreArgs = list(FUN = `*`))
# [[1]]
#      [,1] [,2] [,3]
# [1,]  -14   32   18
# [2,]    7   40   27
#
# [[2]]
#      [,1] [,2]
# [1,]    0    1
# [2,]   10   -1

или

Map(Map, a, b, MoreArgs = list(f = `*`))
# [[1]]
# [[1]][[1]]
# [1] -14   7
#
# [[1]][[2]]
# [1] 32 40
#
# [[1]][[3]]
# [1] 18 27
#
#
#[[2]]
# [[2]][[1]]
# [1]  0 10
#
# [[2]][[2]]
# [1]  1 -1

A tidyverse, альтернативный последнему

1013 *
0 голосов
/ 21 декабря 2018

Так как, вы можете обеспечить length(a[[i]])==length(b[[i]]) мы можем использовать mapply внутри lapply

lapply(seq_along(a), function(x) mapply("*", a[[x]], b[[x]]))


#[[1]]
#     [,1] [,2] [,3]
#[1,]  -14   32   18
#[2,]    7   40   27

#[[2]]
#     [,1] [,2]
#[1,]    0    1
#[2,]   10   -1
...