2016-04-22 104 views
2

我正在尋找某種方法來迭代數值數據框中所有可能的列和行組合。因此它可能看起來像這樣(只是少數的許多可能的組合有可能是):遍歷數據框中所有可能的列和行組合

  • 第一次迭代:列A +行1
  • 第二次迭代:列B +行1
  • 3迭代:柱A + B列+ 1行
  • 第四迭代:柱A + B列+行1 + 2行
  • 等和上...

對於共的每個組合列和行應進行簡單的數學計算並將其結果存儲到數據幀result。這樣我想最終找到產生最高/最低計算結果的列和行的組合。

所以我的代碼看起來是這樣的(相對於計算):

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

所以我的問題是:

  1. 如何創建這樣的R-代碼迭代過程中,即嘗試所有可能的組合的過程?我想使用兩個嵌套的for()環,但我不確定這會工作(尤其是如何處理列/行而不知道它們的名稱和它們的編號)
  2. 如何最終將所有結果存儲到single dataframe 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)) 
+4

沒有太多明確的給我。你是什​​麼意思的「列和行的組合」?你能提供一些例子嗎? – nicola

+0

我沒有看到你描述的重點。既然你查找了最大值,並且所有的數字都是正數(總是如此?),你用'sum(data)'將你的整個列和行相加。對於min,你只需要選擇一行和一列,併爲所有可能的組合做到這一點: 'min(rowSums(expand.grid(colSums(data),rowSums(data))))' –

+0

@Colonel Beauvel :我最終需要一個kmeans聚類,我提供的「calc」代碼只是一個虛擬代碼。對於kmeans聚類它的列和行的選擇是非常重要的,它變得更清楚了嗎? – Joni

回答

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