【问题标题】:Given set of column values, create data.frame with known number of rows给定一组列值,创建具有已知行数的 data.frame
【发布时间】:2017-11-11 06:00:02
【问题描述】:

我正在尝试制作固定行数的数据集来制作测试数据集 - 但是我正在写入一个需要每个列的已知键的目的地。在我的例子中,假设这些键分别是小写字母、大写字母和数字。

我需要创建一个函数,它只提供所需的行数,组合键,使组合的数量等于所需的数量。自然会有一些不可能的情况,比如质数大于最大键,值大于键数的乘积。

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 - 有整数选项,但似乎只支持线性方程。可以使用日志使其线性化,但我不能使用整数选项。
  • factorizegmp 获取因子 - 考虑过这一点,但我想不出一种将主要因子分配回密钥的方法。编辑:可能是装箱问题?

【问题讨论】:

  • 有多少列?
  • 在我的情况下,它通常是四个,但它会有所不同。我总是提前知道有多少个以及密钥是什么。解决问题中的示例足以让我弄清楚如何更广泛地应用它。
  • 我仍在努力理解您所说的组合键以使组合的数量等于所需的数量是什么意思。我还没有全图...
  • 考虑一个更小的例子。假设有两列,其中第一列的键集是小写字母,第二列是大写字母。要获得所有组合唯一的 10 行,以下任何一项都有效:(10 from col1, 1 from col2), (5, 2), (2, 5), (1, 10)。我不需要所有这些,只需要一个有效的组合。
  • 我提供了一个我想要的示例输出,其中输入只是所需的行数。我现在已经指定了。

标签: r


【解决方案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

【讨论】:

  • 这正是我所追求的结果,但你说得对,它只适用于低级别。
  • 为了减少更高 N 的计算时间,您当然可以减少不同变量可以手动获取的值的数量。尽管如此,这是一个警告。
【解决方案2】:

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

  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

这和你问的类似吗?

【讨论】:

  • 不,恐怕。这是错误的方法。在这里,您指定 a1a2。当我提供我想要的行数时,我希望 R 自动计算出这些值。会有多种解决方案,但我只需要一个。
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2020-08-03
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多