给定一组列值,创建具有已知行数

时间:2017-06-09 09:22:20

标签: r

我尝试制作固定行数的数据集来制作测试数据集 - 但是我要写入需要每列已知密钥的目标。对于我的例子,假设这些键分别是小写字母,大写字母和数字。

我需要创建一个函数,只提供所需的行数,组合键使得组合的数量等于所需的数量。当然会有一些不可能的情况,例如素数而不是最大的键,而且值大于键数的乘积。

10行的示例输出数据集如下所示:

data.frame(col1 = rep("a", 10),
           col2 = rep(LETTERS[1:5], 2),
           col3 = rep(1:2, 5))

   col1 col2 col3
1     a    A    1
2     a    B    2
3     a    C    1
4     a    D    2
5     a    E    1
6     a    A    2
7     a    B    1
8     a    C    2
9     a    D    1
10    a    E    2

请注意,我必须手动指定键才能获得所需的行数。我如何安排事情以便R能为我做到这一点?

我已经考虑过的事情

  • optim - 我试图解决的等式实际上是x * y * z = n,其中所有这些都必须是整数。 optim似乎不支持该约束
  • expand.grid然后是子集 - 几乎5亿种组合,耗尽了我的所有记忆 - 不是一种选择。
  • lpSolve - 具有整数选项,但似乎只支持线性方程式。可以使用日志使其成为线性,但我不能使用整数选项。
  • 来自factorize
  • gmp来获取因素 - 考虑到这一点,但我无法想出将主要因素分配回密钥的方法。编辑:也许是垃圾箱包装问题?

2 个答案:

答案 0 :(得分:1)

对于低级别的整数优化,您可以使用网格搜索。其他可能性描述为here

这应该适用于你的例子。

N <- 10
fr <- function(x) { 
  x1 <- x[1]
  x2 <- x[2]
  x3 <- x[3]
  (x1 * x2 * x3 - N)^2
}
library(NMOF)
gridSearch(fr, list(seq(0,5), seq(0,5), seq(0,5)))$minlevels

答案 1 :(得分:0)

我有点不情愿,但我们可以解决问题:

  a1<-2
  a2<-5

  eval(parse(text=paste0("data.frame(col1 = rep(LETTERS[1],",a1*a2,"),col2 = 
  rep(LETTERS[1:",a2,"],",a1,"),col3 = rep(1:",a1,",",a2,"))")))

    col1 col2 col3
1     A    A    1
2     A    B    2
3     A    C    1
4     A    D    2
5     A    E    1
6     A    A    2
7     A    B    1
8     A    C    2
9     A    D    1
10    A    E    2

这与您的要求相似吗?