Наиболее эффективный способ получить все комбинации двух входных данных, возможно, с помощью mapply R - PullRequest
0 голосов
/ 11 июня 2018

Упрощенный пример: допустим, у меня есть два массива:

a <- c(1, 2, 3)
b <- c(2, 3, 4)

И я хочу вычислить сумму обоих массивов для всех комбинаций:

mapply(sum, 1:3, 2:4) даст мне: 1+2;2 + 3;3 + 4

Я ищу

1+2; 1+3; 1+4;

2+2; 2+3; 3+4;

3+2; 3+3; 3+4;

Примечание. Я знаю, что могу решить эту проблему с помощью for петель или combn.Но если у вас более 50 000 массивов, это очень быстро неэффективно.Также обратите внимание, что sum() это просто примерная функция.

1 Ответ

0 голосов
/ 11 июня 2018

Это хорошо работает.outer принимает все комбинации, и вы можете указать их суммирование.

outer(a,b,"+")
#>      [,1] [,2] [,3]
#> [1,]    3    4    5
#> [2,]    4    5    6
#> [3,]    5    6    7

expand.grid будет медленнее, но создаст двухблочный data.frame, с которым вы сможете работать.Обратите внимание, что с expand.grid вы можете передать любое количество векторов, но результат будет быстро расти.Таким образом, это не сработает, если у вас есть миллион вещей, которые можно пересечь с миллионом вещей (в результате получается триллион вещей).Также стоит отметить, что это базовая функция, но вы также можете попробовать tidyr::crossing(a,b) или data.table::CJ, что может быть быстрее (хотя и не в этом примере с игрушкой).

df = expand.grid(a=a,b=b)
head(df)
#>   a b
#> 1 1 2
#> 2 2 2
#> 3 3 2
#> 4 1 3
#> 5 2 3
#> 6 3 3

Из этого вы можете легко извлечьсуммы.

r = df$a+df$b
r
#> [1] 3 4 5 4 5 6 5 6 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...