【问题标题】:Iterate over all possible combinations of columns and rows in a dataframe遍历数据框中所有可能的列和行组合
【发布时间】:2016-08-15 17:54:17
【问题描述】:

我正在寻找某种方法来迭代数字数据框中所有可能的列和行组合。所以它可能看起来像这样(可能是许多可能的组合中的一小部分):

  • 第一次迭代:A 列 + 第 1 行
  • 第二次迭代:B 列 + 第 1 行
  • 第三次迭代:A 列 + B 列 + 第 1 行
  • 第 4 次迭代:A 列 + B 列 + 第 1 行 + 第 2 行
  • 等等等等……

对于列和行的每个组合,都应进行简单的数学计算,并将其结果存储到数据框result。这样我想最终找到产生最高/最低计算结果的列和行的组合。

所以我的代码看起来像这样(关于计算):

calc = sum(sum(colSums(data)) + sum(rowSums(data)) / (nrow(data) * ncol(data)))

所以我的问题是:

  1. 如何在 r 代码中创建这个 迭代 过程,即尝试所有可能组合的过程?我曾想过使用两个嵌套的for()-loop,但我不确定这是否可行(尤其是如何在不知道它们的名称和编号的情况下处理列/行)
  2. 我怎样才能最终将所有结果存储到一个单个数据框resultresult 应包含计算结果以及列和行的相应组合。

你有什么想法我可以解决这个问题吗?

这里有一些数据可供参考:

data = structure(list(GDP = c(18.2, 8.5, 54.1, 1.4, 2.1, 83.6, 17), 
    Population = c(1.22, 0.06, 0, 0.54, 2.34, 0.74, 1.03), Birth.rate = c(11.56, 
    146.75, 167.23, 7, 7, 7, 10.07), Income = c(54, 94, 37, 95, 
    98, 31, 78), Savings = c(56.73, 56.49, 42.81, 70.98, 88.24, 
    35.16, 46.18)), .Names = c("GDP", "Population", "Birth.rate", 
    "Income", "Savings"), class = "data.frame", row.names = c(NA, 
    -7L))

【问题讨论】:

  • 我不太清楚。 combinations of columns and rows 是什么意思?你能提供例子吗?
  • 我看不出你描述的重点。由于您寻找最大值并且所有数字都是正数(总是这样吗?),因此您将整个列和行与sum(data) 相加。对于最小值,您只需要选择一行和一列并为所有可能的组合执行此操作:min(rowSums(expand.grid(colSums(data), rowSums(data))))
  • @Colonel Beauvel:我最终需要它来进行 kmeans 聚类,我提供的“计算”代码只是一个虚拟代码。对于kmeans聚类来说,列和行的选择很重要,是不是变得更清晰了?
  • @nicola:我编辑了我的问题,它变得更清楚了吗?
  • 我不确定您是否意识到您正在尝试做的事情的复杂性。无论如何,我会回答我自己的问题。你的组合数是(2^ncol(data)-1)*(2^nrow(data)-1)。如果data 有 30 行,那么这个数字会变得很大。无论如何,要开始尝试unlist(lapply(seq_along(data),function(x) combn(data,x,simplify=FALSE)),recursive=FALSE)。它将为您提供仅列的所有组合。对于列表的每个元素,您必须选择行。

标签: r algorithm dataframe iteration combinatorics


【解决方案1】:

我并没有完全遵循我们想要实现的目标,也许这是一个开始:

library(data.table)

cc <- 1:ncol(data)
rr <- 1:nrow(data)

rbindlist(
  lapply(cc, function(i){
    ccN <- combn(cc, i)
    rbindlist(
      apply(ccN, 2, function(iN){
        rbindlist(
          lapply(rr, function(j){
            rrN <- combn(rr, j)
            rbindlist(
              apply(rrN, 2, function(jN){
                data.frame(
                  Sum = sum(c(
                    unlist(data[jN, ]),
                    unlist(data[, iN]))),
                  Desc = paste(c("rows",jN,"cols",iN), collapse = ",")
                )
              })
            )
          })
        )
      })
    )
  })
)


#          Sum                              Desc
#   1:  326.61                     rows,1,cols,1
#   2:  490.70                     rows,2,cols,1
#   3:  486.04                     rows,3,cols,1
#   4:  359.82                     rows,4,cols,1
#   5:  382.58                     rows,5,cols,1
#  ---                                          
#3933: 2687.14   rows,1,2,3,5,6,7,cols,1,2,3,4,5
#3934: 2560.92   rows,1,2,4,5,6,7,cols,1,2,3,4,5
#3935: 2556.26   rows,1,3,4,5,6,7,cols,1,2,3,4,5
#3936: 2720.35   rows,2,3,4,5,6,7,cols,1,2,3,4,5
#3937: 2862.06 rows,1,2,3,4,5,6,7,cols,1,2,3,4,5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多