【问题标题】:Function for creating combinations in R在 R 中创建组合的函数
【发布时间】:2016-01-04 23:03:23
【问题描述】:

我需要使用最小值为 5 和最大值为 80 的“n”个变量创建组合,它们之间的差异为 x,并且每个组合的值之和应等于 100。

【问题讨论】:

  • 请注明所使用的语言。
  • 您似乎大部分时间都在那里(除了不同之处)。您究竟需要什么帮助?
  • 现在它仅限于 m1,m2,m3,m4。我正在寻找的是一个函数,我不必在“m”增加时输入这些,但更像是一个范围,如果 m 是 10,那么 1-10,而不是输入 m1,m2,....m10在这段代码中
  • 更像一个循环函数!
  • @SagarRamsinghani Gotcha,请参阅我的回复。

标签: r loops syntax combinations


【解决方案1】:

对于n个变量,你需要将可变数量的参数传递给expand.grid。您可以为此使用do.call

combs = do.call(expand.grid, rep(list(seq(from = 5, to = 80, by = 5)), n))

如果您想自定义名称,您需要单独分配它们(通过setNames)。例如,要获取名称 m1mn,请使用:

values = rep(list(seq(from = 5, to = 80, by = 5)), n)
names = paste0('m', seq_len(n))
combs = do.call(expand.grid, setNames(values, names))

此外,我不会将总数存储在同一个 data.frame 中——使用单独的变量:

total = rowSums(combs)

……但这实际上甚至没有必要。

放在一个函数定义中:

my_combs = function (n, from, to, by, total) {
    values = rep(list(seq(from, to, by)), n)
    names = paste0('m', seq_len(n))
    combs = do.call(expand.grid, setNames(values, names))
    combs[rowSums(combs) == total, ]
}

而你(例如)这样称呼它:

result = my_combs(n = 2, from = 5, to = 80, by = 5, total = 100)

产量:

> result
    m1 m2
64  80 20
79  75 25
94  70 30
109 65 35
124 60 40
139 55 45
154 50 50
169 45 55
184 40 60
199 35 65
214 30 70
229 25 75
244 20 80

【讨论】:

  • 太棒了!我如何打印所有组合,只显示几个,其余的被省略?
  • @SagarRamsinghani 它打印所有组合。您可能对行号感到困惑。我们在最后一行执行的子集设置不涉及行名(即数字)。因此,例如,如果我们过滤掉第一行,结果表将有第一行,其名称/编号不同。
  • 不确定我哪里出错了:dynamic = function (4, 5, 80, 5, 100) { combs = do.call(expand.grid, rep(list(seq(5, 80) , 5)), 4)) comb_total = rowSums(combs) 梳子[comb_total == 100, ] }
  • @SagarRamsinghani 您对定义函数和调用函数感到困惑。查看更新的答案。
  • 你不需要 do.call -- expand.grid 可以获取列表,所以只需expand.grid(rep(list(seq(...)), n))
猜你喜欢
  • 2020-01-04
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多