【问题标题】:R: get all combinations of three numbers that add up to 100R:得到三个数字加起来等于 100 的所有组合
【发布时间】:2017-10-16 19:53:49
【问题描述】:

我有三个变量:X、Y 和 Z。我想找到 X、Y 和 Z 的所有组合加起来为 100。X、Y 和 Z 只能取 [0,100] 之间的值。输出应该看起来像这样:

  X   Y   Z   Sum
100   0   0   100
 99   1   0   100
 99   0   1   100
 98   2   0   100
 98   1   1   100
 98   0   2   100

等等……

关于如何获得所有可能的组合的任何建议?

【问题讨论】:

标签: r combinations


【解决方案1】:

另一种选择(可能对大数字更有效)是

df <- do.call(rbind, lapply(0:100, function(i) data.frame(x=i, y=0:(100-i))))
df$z <- 100-df$x-df$y

【讨论】:

  • 这可能比我的解决方案扩展得更好,因为您只生成正确的行,而不是所有组合然后子集。在我的方法中,远高于 0:100 会占用大量 RAM。
【解决方案2】:

由于您仅在三列上限制为 1:100,因此很容易暴力破解。如果范围更大,则需要更聪明的解决方案。

library(data.table)

df <- expand.grid(X = 0:100,
                  Y = 0:100,
                  Z = 0:100)

setDT(df)

df[, Sum := X + Y + Z]
df[Sum == 100]
#         X Y   Z Sum
#    1: 100 0   0 100
#    2:  99 1   0 100
#    3:  98 2   0 100
#    4:  97 3   0 100
#    5:  96 4   0 100
#   ---              
# 5147:   1 1  98 100
# 5148:   0 2  98 100
# 5149:   1 0  99 100
# 5150:   0 1  99 100
# 5151:   0 0 100 100

【讨论】:

  • 不错的解决方案!过去一周我都在和expand.grid 一起工作,但我没想到!
  • 或者更简单的df[(X + Y + Z) == 100]
  • @RichScriven True,但需要添加 Sum 列才能在 OP 中获取输出。可以做到df[(X + Y + Z) == 100, .(X, Y, Z, Sum = 100)],但我不确定这是否比两步更清楚。
  • 哦,我明白了。不过,我并没有真正看到额外专栏的意义。如果我们做得对,我们可以确信他们都将达到 100 岁。
  • 一种较少占用内存的方法是在XY 上使用expand.grid,过滤X+Y&lt;=100,然后计算Z
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多