【发布时间】:2016-11-15 01:59:31
【问题描述】:
假设我有两个向量
upVariables<-c("up1", "up2", "up3", "up4", "up5")
downVariables<-c("down1", "down2", "down3", "down4", "down5")
这些中的每一个都将用于在另一个向量中查找一个数字。我正在寻找所有可能的两个比率集(所有可能的四个变量集,每个向量两个),其中分子始终来自 upVariables,分母始终来自 downVariables,最终集合不使用相同的变量两次。
我已经做到了
upCombos<-combn(upVariables,2)
downCombos<-combn(downVariables,2)
combos<-arrange(expand.grid(upCombos=upCombos[,1],downCombos=downCombos[,1]),upCombos)
我在这里只使用第一个可能的组合来说明,但我想遍历所有可能的组合。这给了我:
> combos
upCombos downCombos
1 up1 down1
2 up1 down2
3 up2 down1
4 up2 down2
不过,我想从中制作两套,比如:
> combos[1]
upCombos downCombos
1 up1 down1
2 up2 down2
和
> combos[2]
upCombos downCombos
1 up1 down2
2 up2 down1
因此,在每种情况下,upCombos 中的每个值都只使用一次,downCombos 中的每个值只使用一次。那有意义吗?关于如何解决这个问题的任何想法?
理想情况下,我希望能够推广到从原始向量中采样的 3 个集合,而不是 2 个集合,但我很高兴现在让 2 个集合起作用。
** 编辑 因此,Jota 提供了一个解决方案,该解决方案提供了任何一组 4 个变量(2 个来自 upVariables,2 个来自 downVariables)的安排。不过,我仍然看不到我如何遍历所有可能的 4 个变量集。我最接近的方法是将 Jota 的建议放在两个 for 循环中(发现尚未 R 程序员)。这将返回比应有的更少的组合。
n<-2
offset<-n-1
for (i in 1:(length(upVariable)-offset)){
for (j in 1:(length(downVariables)-offset)){
combos <- expand.grid(upVariables[i:(i+offset)], downVariables[j:(j+offset)])
combos <- combos[with(combos, order(Var1)), ] # use dplyr::arrange if you prefer
mat <- matrix(1:n^2, byrow = TRUE, nrow = n)
for(j in 2:nrow(mat) ) mat[j, ] <- mat[j, c(j:ncol(mat), 1:(j - 1))]
pairs<-(split(combos[c(mat), ], rep(1:n, each = n)))
collapsed<-sapply(lapply(pairs, apply, 1, paste, collapse = '_'), paste, collapse = '-')
ratioGroups<-c(ratioGroups,collapsed)
}
}
这仅返回 16 组变量(每组有 2 个组合,因此总共 32 个)。但是,每组有 5 个变量,还有更多的可能性。
【问题讨论】:
标签: r