Получить все возможные суммы и список вывода на основе значений - PullRequest
1 голос
/ 05 февраля 2020

У меня есть фрейм данных с двумя столбцами: LOOKUP, который содержит номер индекса, а другой, VALUE, который содержит строку, связанную с этим номером:

LOOKUP    VALUE
1000      Apple
100       Banana
10        Grape
1         Orange

Показано ниже в R код:

dat <- data.frame(LOOKUP= c(1000, 100, 10, 1),
                  VALUE = c("Apple", "Banana", "Grape", "Orange"))

В этом примере есть 15 возможных сумм искомого значения:

  • 4 суммы, где суммируется только одно число (1000, 100, 10, 1)
  • 6 сумм двух чисел (1000 + 100, 1000 + 10, 1000 + 1, 100 + 10, 100 + 1, 10 + 1)
  • 4 суммы трех чисел (1000 + 100 + 10, 1000 + 100 + 1, 1000 + 10 + 1, 100 + 10 + 1)
  • 1 сумма из четырех чисел (1000 + 100 + 10 + 1)

Эти суммы используются, чтобы понять, из-за отсутствия лучшего описания, какие фрукты находятся в корзине. Например, если сумма = 1100, мы знаем, что в корзине есть яблоко и банан. Кто-нибудь знает, как бы я сделал это для всех возможных комбинаций в моем наборе? Мой желаемый вывод - это новый фрейм данных в соответствии с:

SUM    VALUES
1111   Apple, Banana, Grape, Orange
...
1100   Apple, Banana
...
11     Grape, Orange
1      Apple

1 Ответ

1 голос
/ 05 февраля 2020

Одно решение с участием purrr, tibble, dplyr и tidyr может быть:

map(.x = 1:nrow(dat), ~ combn(dat$VALUE, .x, paste, collapse = ",") %>%
     enframe()) %>%
 bind_rows() %>%
 rowid_to_column() %>%
 separate_rows(value) %>%
 left_join(dat, by = c("value" = "VALUE")) %>%
 group_by(rowid) %>%
 summarise(comb = toString(value),
           sum = sum(LOOKUP))

  rowid comb                           sum
   <int> <chr>                        <dbl>
 1     1 Apple                         1000
 2     2 Banana                         100
 3     3 Grape                           10
 4     4 Orange                           1
 5     5 Apple, Banana                 1100
 6     6 Apple, Grape                  1010
 7     7 Apple, Orange                 1001
 8     8 Banana, Grape                  110
 9     9 Banana, Orange                 101
10    10 Grape, Orange                   11
11    11 Apple, Banana, Grape          1110
12    12 Apple, Banana, Orange         1101
13    13 Apple, Grape, Orange          1011
14    14 Banana, Grape, Orange          111
15    15 Apple, Banana, Grape, Orange  1111

Пример данных:

dat <- data.frame(LOOKUP= c(1000, 100, 10, 1),
                  VALUE = c("Apple", "Banana", "Grape", "Orange"),
                  stringsAsFactors = FALSE)
...