combn 返回的梳子数量减少了 R 中的一些梳子
Number of combs returned by combn reduced by some combs in R
我想弄清楚如何在排除某些选定组合后计算 combn 函数返回的组合数。比方说,我们有一个向量 c("var1","var2","var3","var4","var5") 我想得到元素的所有组合这个除了那些由 c("var4","var5") 组成的。这是代码:
vector <- c("var1","var2","var3","var4","var5")
exclude <- matrix(c("var4","var5"),1,2)
for(i in 1:length(vector)){
comb <- combn(vector,i)
for(j in 1:ncol(comb)){
newcomb <- c(comb[,j])
if (any(as.logical("FALSE"),apply(exclude, 1, function(x) all(x %in% newcomb)))) {next}
else {print(newcomb)}}
}
combn函数返回的组合数没有任何归约是31,计算为:
f <- function(nvars){
a <- NULL
for (i in 1:nvars){
a[i] <- choose(nvars,i)}
return(sum(a))}
f(5)
任何关于如何获得减少组合数量的建议(对于 5 个变量和排除同时包含 "var4" 和 "var5" 的组合,它应该是 23)。谢谢!
我们循环遍历vector
的序列,通过指定'm'作为序列值得到combn
,然后检查all
是否是'exclude'元素有%in%
组合元素,求反(!
),unlist
list
得到逻辑元素sum
sum(unlist(lapply(seq_along(vector), function(i) combn(vector, i,
FUN = function(x) !all(c(exclude) %in% x)))))
#[1] 23
我寻求的解决方案之一:
f <- function(x,y){
a <- NULL
for (i in 1:x){
a[i] <- choose(x,i) - choose(x-y,i-y)}
return(sum(a))}
f(5,2)
@Andrew Gustar - 感谢您的建议!
我仍然需要为矩阵找到更通用的解决方案,其中要排除的变量(其中一些是不同的,一些不是):
vector <- c("var1","var2","var3","var4","var5","var6","var7","var8")
exclude <- matrix(c(c("var3","var2"),c("var4","var3"),c("var5","var7")),3,2)).
这将计算任何输入 vector
和 exclude
的组合数(它基于问题中的循环)...
sum(sapply(seq_along(vector), #sum for all combination lengths...
function(i) sum(apply(combn(vector, i), 2, #...the sum for all combinations...
function(y) !any(apply(exclude, 1, #...the value for each row of exclude...
function(x) all(x %in% y))))))) #...whether combn doesn't contain exclude row
[1] 71 #for the example you give
我想弄清楚如何在排除某些选定组合后计算 combn 函数返回的组合数。比方说,我们有一个向量 c("var1","var2","var3","var4","var5") 我想得到元素的所有组合这个除了那些由 c("var4","var5") 组成的。这是代码:
vector <- c("var1","var2","var3","var4","var5")
exclude <- matrix(c("var4","var5"),1,2)
for(i in 1:length(vector)){
comb <- combn(vector,i)
for(j in 1:ncol(comb)){
newcomb <- c(comb[,j])
if (any(as.logical("FALSE"),apply(exclude, 1, function(x) all(x %in% newcomb)))) {next}
else {print(newcomb)}}
}
combn函数返回的组合数没有任何归约是31,计算为:
f <- function(nvars){
a <- NULL
for (i in 1:nvars){
a[i] <- choose(nvars,i)}
return(sum(a))}
f(5)
任何关于如何获得减少组合数量的建议(对于 5 个变量和排除同时包含 "var4" 和 "var5" 的组合,它应该是 23)。谢谢!
我们循环遍历vector
的序列,通过指定'm'作为序列值得到combn
,然后检查all
是否是'exclude'元素有%in%
组合元素,求反(!
),unlist
list
得到逻辑元素sum
sum(unlist(lapply(seq_along(vector), function(i) combn(vector, i,
FUN = function(x) !all(c(exclude) %in% x)))))
#[1] 23
我寻求的解决方案之一:
f <- function(x,y){
a <- NULL
for (i in 1:x){
a[i] <- choose(x,i) - choose(x-y,i-y)}
return(sum(a))}
f(5,2)
@Andrew Gustar - 感谢您的建议!
我仍然需要为矩阵找到更通用的解决方案,其中要排除的变量(其中一些是不同的,一些不是):
vector <- c("var1","var2","var3","var4","var5","var6","var7","var8")
exclude <- matrix(c(c("var3","var2"),c("var4","var3"),c("var5","var7")),3,2)).
这将计算任何输入 vector
和 exclude
的组合数(它基于问题中的循环)...
sum(sapply(seq_along(vector), #sum for all combination lengths...
function(i) sum(apply(combn(vector, i), 2, #...the sum for all combinations...
function(y) !any(apply(exclude, 1, #...the value for each row of exclude...
function(x) all(x %in% y))))))) #...whether combn doesn't contain exclude row
[1] 71 #for the example you give