Как применить функцию combn () к столбцу типа списка?

У меня есть фреймворк с 3 столбцами, один из которых имеет тип списка

>head(basket_data)
# A tibble: 8 x 3
  order_id items      count
     <int> <list>     <int>
1        2 <chr [9]>      9
2        3 <chr [8]>      8
3        4 <chr [13]>    13
4        5 <chr [26]>    26
5        6 <chr [3]>      3

Скажем, для строки 1 (order_id 2) список [a, b, c]

Я хочу создать новый столбец с помощью функции combn (возможно?), Которая будет иметь все парные комбинации списка только для этой строки, поэтому [[a, b], [b, c], [a, c]]

Все примеры использования combn, с которыми я сталкивался на SO, объединили каждый список в фреймворке данных и объединили целые списки. Любая помощь будет оценена по достоинству. Спасибо!


person kenneth-rebello    schedule 18.05.2021    source источник
comment
Вы можете предоставить dput(head(basket_data))?   -  person maydin    schedule 18.05.2021


Ответы (2)


Допустим, ваши данные выглядят примерно так

test <- structure(list(items = list(c('a', 'b'), c('b', 'c', 'd'), c('d', 'e'), c('f', 'g', 'i'), c('g', 'h')), 
               ID = 1:5), row.names = c(NA, 5L), class = "data.frame")

test
    items ID
1    a, b  1
2 b, c, d  2
3    d, e  3
4 f, g, i  4
5    g, h  5

as_tibble(test)
# A tibble: 5 x 2
  items        ID
  <list>    <int>
1 <chr [2]>     1
2 <chr [3]>     2
3 <chr [2]>     3
4 <chr [3]>     4
5 <chr [2]>     5

Тогда вы можете сделать что-то вроде этого

as_tibble(test) %>% mutate(combs = map(items, ~combn(.x, 2)))

# A tibble: 5 x 3
  items        ID combs            
  <list>    <int> <list>           
1 <chr [2]>     1 <chr[,1] [2 x 1]>
2 <chr [3]>     2 <chr[,3] [2 x 3]>
3 <chr [2]>     3 <chr[,1] [2 x 1]>
4 <chr [3]>     4 <chr[,3] [2 x 3]>
5 <chr [2]>     5 <chr[,1] [2 x 1]>

Проверять

as_tibble(test) %>% mutate(combs = map(items, ~combn(.x, 2))) %>%
  data.frame()
    items ID            combs
1    a, b  1             a, b
2 b, c, d  2 b, c, b, d, c, d
3    d, e  3             d, e
4 f, g, i  4 f, g, f, i, g, i
5    g, h  5             g, h

OR

as_tibble(test) %>% mutate(combs = map(items, ~combn(.x, 2, list)))

# A tibble: 5 x 3
  items        ID combs     
  <list>    <int> <list>    
1 <chr [2]>     1 <list [1]>
2 <chr [3]>     2 <list [3]>
3 <chr [2]>     3 <list [1]>
4 <chr [3]>     4 <list [3]>
5 <chr [2]>     5 <list [1]>

зависит от формата ввода и вывода, который вы хотите

person AnilGoyal    schedule 18.05.2021

Вот попытка использовать dplyr & purrr с некоторыми образцами данных, сгенерированными случайным образом, используя ваш пример совместного использования.

library(dplyr)
library(purrr)

set.seed(10)
basket_data <- tibble(
  order_id = seq(2, 6, by = 1),
  items = lapply(floor(runif(5, 5, 20)),
    FUN = function(x) { sample(letters, size = x) }),
  count = floor(runif(5, 1, 30))
)

basket_data$new_col <- map(basket_data$items,
  .f = function(x) combn(x, 2, FUN = function(x) list(x)))

basket_data
#> # A tibble: 5 x 4
#>   order_id items      count new_col     
#>      <dbl> <list>     <dbl> <list>      
#> 1        2 <chr [12]>    24 <list [66]> 
#> 2        3 <chr [9]>      8 <list [36]> 
#> 3        4 <chr [11]>     5 <list [55]> 
#> 4        5 <chr [15]>     5 <list [105]>
#> 5        6 <chr [6]>     15 <list [15]>

Пример результатов

# Here is first items list
basket_data$items[[1]]
#>  [1] "w" "h" "v" "g" "s" "o" "u" "j" "z" "x" "b" "y"

# Here is some example of new_col for first items
basket_data$new_col[[1]][1:10]
#> [[1]]
#> [1] "w" "h"
#> 
#> [[2]]
#> [1] "w" "v"
#> 
#> [[3]]
#> [1] "w" "g"
#> 
#> [[4]]
#> [1] "w" "s"
#> 
#> [[5]]
#> [1] "w" "o"
#> 
#> [[6]]
#> [1] "w" "u"
#> 
#> [[7]]
#> [1] "w" "j"
#> 
#> [[8]]
#> [1] "w" "z"
#> 
#> [[9]]
#> [1] "w" "x"
#> 
#> [[10]]
#> [1] "w" "b"

Создано 18 мая 2021 года пакетом REPEX (v2.0.0)

person Sinh Nguyen    schedule 18.05.2021