【问题标题】:Creating combination of sequences创建序列组合
【发布时间】:2014-11-01 00:12:13
【问题描述】:

我正在尝试解决以下问题:

考虑 5 个简单序列:0:100、100:0、rep(0,101)、rep(50,101)、rep(100,101)

我需要 3 个数值变量的集合,它们在所有组合中都有上述序列。由于有 5 个序列和 3 个变量,因此可以有 5*5*5 个组合,因此每个变量共有 12625 个(5*5*5*101)个数字(每个序列 101 个)。

这些可以分组在 12625 行和 4 列的 data.frame 中。第一列 (V) 将简单地具有 seq(1:12625) (可以使用行号代替它)。其他 3 列(A、B、C)将具有以上 5 个不同组合的序列。例如,前 101 行将在所有 3 个 A、B 和 C 中具有 0:100。接下来的 101 行将在 A 和 B 中具有 0:100,在 C 中具有 100:0。依此类推...

我可以将序列创建为:

s = list()
s[[1]] = 0:100
s[[2]] = 100:0
s[[3]] = rep(0,101)
s[[4]] = rep(50,101)
s[[5]] = rep(100,101)

但是如何进一步进行呢?我真的不需要数据框,但我需要一个函数,它返回一个列表,其中包含发送给它的数字(第一列或 V 列)的 c(A,B,C) 值。这个数字显然可以在 1 到 12625 之间变化。

我怎样才能创建这样的功能。我更喜欢矢量解决方案或使用应用族函数来优化速度的解决方案。

【问题讨论】:

    标签: r


    【解决方案1】:

    您要求矢量化解决方案,所以这里只使用data.table(类似于@SimonGs 方法)

    library(data.table)
    grd <- CJ(A = seq_len(5), B = seq_len(5), C = seq_len(5))
    res <- grd[, lapply(.SD, function(x) unlist(s[x]))]
    res
    #          A   B   C
    #     1:   0   0   0
    #     2:   1   1   1
    #     3:   2   2   2
    #     4:   3   3   3
    #     5:   4   4   4
    #  ---            
    # 12621: 100 100 100
    # 12622: 100 100 100
    # 12623: 100 100 100
    # 12624: 100 100 100
    # 12625: 100 100 100
    

    【讨论】:

      【解决方案2】:

      我想出了两个解决方案。我发现这很难用apply 之类的,因为它们往往会给出一个不太好处理的输出(也许有人可以比我更好地“驯服”它们:D)

      第一个解决方案使用对lapply 的单独调用,第二个解决方案使用for 循环和一些编程No-No。我个人更喜欢第二个,虽然第一个更快...

      grd <- expand.grid(a=1:5,b=1:5,c=1:5)
      
      # apply-ish
      A <- lapply(grd[,1], function(z){ s[[z]] })
      B <- lapply(grd[,2], function(z){ s[[z]] })
      C <- lapply(grd[,3], function(z){ s[[z]] })
      dfr <- data.frame(A=do.call(c,A), B=do.call(c,B), C=do.call(c,C))
      
      # for-ish
      mat <- NULL
      for(i in 1:nrow(grd)){
       cur <- grd[i,]
       tmp <- cbind(s[[cur[,1]]],s[[cur[,2]]],s[[cur[,3]]])
       mat <- rbind(mat,tmp)
      }
      

      dfrmat 的输出似乎和你描述的一样。

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 2017-06-24
        相关资源
        最近更新 更多