我有一个 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.frame
和 rbind
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.frame
,left_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/