检索给定大小 k 的 n 项的所有可能组合,并在另一列上应用函数 sum

标签 r dplyr combinations permutation

我有一个 df 看起来像:

  item value
1    a     1
2    b     4
3    c     3
4    d     2
5    e     6
6    f     8
7    g    11

df <- data.frame(stringsAsFactors=FALSE,
        item = c("a", "b", "c", "d", "e", "f", "g"),
       value = c(1L, 4L, 3L, 2L, 6L, 8L, 11L))

我想生成 size = 3 项目的所有可能组合,例如:

size <- 3

combo_3 <- combn(df$item, size, simplify = F)

现在我想总结一下这个结果。

我想要一个数据框包含:

  • 组合索引
  • 组合中的项目
  • 该特定组合的列值的总和

这里是第一个组合出现的示例数据框:

combo_index    item    sum_total
1                 a        8
1                 b        8
1                 c        8
2                 a        7
2                 b        7
2                 d        7
3                 a        11
3                 b        11
3                 e        11 
             ...
             ...
             ...

最佳答案

这可以通过遍历 list 来实现,根据与 'df' 中的 'item' 匹配得到相应的 'value',创建一个 data.framerbind list 元素

library(data.table)
rbindlist(lapply(combo_3, function(x) data.frame(item = x, 
  sum_total = sum(setNames(df$value, df$item)[x])) ), 
            idcol = 'combo_index')
#     combo_index item sum_total
#  1:           1    a         8
#  2:           1    b         8
#  3:           1    c         8
#  4:           2    a         7
#  5:           2    b         7
# ---                           
#101:          34    f        21
#102:          34    g        21
#103:          35    e        25
#104:          35    f        25
#105:          35    g        25

或者更好的做法是将 stack list 成两列 data.frameleft_join原始数据集,按'ind'分组得到'value'的sum

library(tidyverse)
setNames(combo_3, seq_along(combo_3)) %>% 
    stack %>%
    left_join(df, by = c("values" = "item")) %>%
    group_by(ind) %>%
    mutate(value = sum(value)) %>%
    ungroup %>%
    select(combo_index = ind, item = values, sum_total = value)
# A tibble: 105 x 3
#   combo_index item  sum_total
#   <fct>       <chr>     <int>
# 1 1           a             8
# 2 1           b             8
# 3 1           c             8
# 4 2           a             7
# 5 2           b             7
# 6 2           d             7
# 7 3           a            11
# 8 3           b            11
# 9 3           e            11
#10 4           a            13
# ... with 95 more rows

关于检索给定大小 k 的 n 项的所有可能组合,并在另一列上应用函数 sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523809/

相关文章:

r - 没有足够的明确预测来计算 roc 下的面积

r - 如何在图形的轴上插入点

algorithm - 这个用于计算组合的天真代码的大 O 复杂度是多少?

python - 一个词的所有可能组合 - Python

r - 在 R 中使用 modelrs bootstrap 获取中位数

r - 我想根据同一数据框中其他列的条件从 R 数据框中的列生成 8 种名称组合

r - 你如何在 R 中将 double 转换为整数?

r - 向 R 中的刻面图添加刻度线

r - pmin() 与 dplyr 在 R

R:使用共享名称模式的多列将数据 reshape 为更长的格式