我尝试制作固定行数的数据集来制作测试数据集 - 但是我要写入需要每列已知密钥的目标。对于我的例子,假设这些键分别是小写字母,大写字母和数字。
我需要创建一个函数,只提供所需的行数,组合键使得组合的数量等于所需的数量。当然会有一些不可能的情况,例如素数而不是最大的键,而且值大于键数的乘积。
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
来获取因素 - 考虑到这一点,但我无法想出将主要因素分配回密钥的方法。编辑:也许是垃圾箱包装问题?答案 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
这与您的要求相似吗?