Outline

我正在试图在一个列表中找到一个数字,这些数字等于一个给定的和.我设法用简洁的语法计算了数字及其总和的所有组合.但我无法将生成的嵌套列表重新构造为不同类型的嵌套列表.

Minimal example

library(data.table)
library(purrr)

# raw data and basic operation
dt <- data.table(
  amount = c(2,5,9)
)[,
  `:=`(
    # nesting combinations into the data.table
    amount.set = map(1:.N,function(x) combn(amount,x)),
    sum = map(1:.N,function(x) colSums(combn(amount,x)))
  )
]

# desired structure of nested list
desired.output <- data.table(
  sum = c(2,5,9,7,11,14,16),
  amount.set = list(c(2),c(5),c(9),c(2,5),c(2,9),c(5,9),c(2,5,9))
)

我怎么才能在desired.output里实现这个 struct 呢?

推荐答案

不确定我们是否需要中间计算,我们可以使用:

data.table( id = 1:3, amount = c(2,5,9)
  )[, .(amount.set = unlist(lapply(1:.N, combn, x = amount, simplify = FALSE),
                            recursive = FALSE))
  ][, sum_ := sapply(amount.set, sum)][]
#    amount.set  sum_
#        <list> <num>
# 1:          2     2
# 2:          5     5
# 3:          9     9
# 4:        2,5     7
# 5:        2,9    11
# 6:        5,9    14
# 7:      2,5,9    16

备注:

  • lapply在这里相当于map
  • 这与您的第一次try 之间的第一个关键区别是,我使用的是simplify=FALSE,这意味着每个组合(例如,c(2,5))都在它自己的列表中,而不是一个矩阵(其中每一列都是一个组合);
  • 接下来,因为我们实际上有一个嵌套的列表 struct ,所以我们需要一个非递归的unlist
  • 此列表与您的列表之间的第二个关键区别是,我们根据实际的组合列表来计算列表上的和,而不是两次计算combn(..)

R相关问答推荐

为什么t使用ifelse()基于两个DF中的匹配观察创建新列不适用于此数据?

生成具有受控相关性的x和y

从字符载体创建函数参数

在R中,如何创建时间间隔的图表?

IQR()和stats之间四分位距计算的差异::分位数()在R和' ggpubr '

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

在特定列上滞后n行,同时扩展框架的长度

使用spatVector裁剪网格数据时出现的问题

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

r—绘制相交曲线

如何计算R数据集中每个女性的子元素数量?

使用sf或terra的LINESTRAING的累积长度

如何编辑gMarginal背景以匹配绘图背景?

用关联字符串替换列名的元素

如何写商,水平线,在一个单元格的表在R

如何对2个列表元素的所有组合进行操作?

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

如果COLSUM为>;0,则COLNAME为向量

如何使用FormC使简单算术运算得到的数字是正确的?

长/纬点继续在堪萨斯-SF结束,整齐的人口普查