遍历数据框中所有可能的列和行组合
问题描述:
我正在寻找某种方法来迭代数值数据框中所有可能的列和行组合。因此它可能看起来像这样(只是少数的许多可能的组合有可能是):遍历数据框中所有可能的列和行组合
- 第一次迭代:列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)))
所以我的问题是:
- 如何创建这样的R-代码迭代过程中,即尝试所有可能的组合的过程?我想使用两个嵌套的
for()
环,但我不确定这会工作(尤其是如何处理列/行而不知道它们的名称和它们的编号) - 如何最终将所有结果存储到single dataframe
result
?result
应包含计算结果和各列和行的组合。
你有什么想法我可以解决这个问题吗?
下面是一些数据一起玩:
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))
答
我不完全以下是我们正在努力实现,也许这是一个开始:
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
没有太多明确的给我。你是什么意思的“列和行的组合”?你能提供一些例子吗? – nicola
我没有看到你描述的重点。既然你查找了最大值,并且所有的数字都是正数(总是如此?),你用'sum(data)'将你的整个列和行相加。对于min,你只需要选择一行和一列,并为所有可能的组合做到这一点: 'min(rowSums(expand.grid(colSums(data),rowSums(data))))' –
@Colonel Beauvel :我最终需要一个kmeans聚类,我提供的“calc”代码只是一个虚拟代码。对于kmeans聚类它的列和行的选择是非常重要的,它变得更清楚了吗? – Joni