给定一个整数K和一个维数d,如何得到R中length(alpha) = dsum(alpha) = K的所有多索引alpha

例如:对于K=3d=2,如果我们将多个索引组织在一个列表alphas中,我们将得到

alphas[[1]] = c(3,0)
alphas[[2]] = c(2,1)
alphas[[3]] = c(1,2)
alphas[[4]] = c(0,3)

推荐答案

根据描述,我们可以在从"0"到"k"的序列上使用expand.grid,在rep次重复list次"d"之后,然后Filter次仅使用sum作为"k"的行

f1 <- function(k, d) { 
 lapply(Filter(function(x) sum(x) == k, 
      asplit(expand.grid(rep(list(0:k), d)), 1)), unname)

}

-测试

> f1(3, 2)
[[1]]
[1] 3 0

[[2]]
[1] 2 1

[[3]]
[1] 1 2

[[4]]
[1] 0 3

或者用rowSums过滤会稍微快一点

d1 <- expand.grid(rep(list(0:3), 2))
asplit(unname(d1)[rowSums(d1) == 3,], 1)

还有一个基于约束的组合函数Rcpp算法s

f2 <- function(k, d) {

 out <- Rcpp算法s::comboGeneral(0:k, d, constraintFun = "sum", 
      comparisonFun = "==", limitConstraints = k)
 asplit(rbind(out, out[, ncol(out):1]), 1)

}

-测试

> f2(3, 2)
[[1]]
[1] 0 3

[[2]]
[1] 1 2

[[3]]
[1] 3 0

[[4]]
[1] 2 1

或者就像@JosephWood提到的,permuteGeneralcomboGeneral更合适

k <- 3
d <- 2
permuteGeneral(0:k, d, TRUE, constraintFun = "sum",
  comparisonFun = "==", limitConstraints = k)

还是compositions

library(partitions)
asplit(compositions(k, d), 2)

R相关问答推荐

如何在emmeans中计算连续变量的对比度

使用tidy—select创建一个新的带有mutate的摘要变量

筛选出以特定顺序患病的个体

IMF IFS数据以R表示

将多列合并为单独的名称—值对

使用for循环和粘贴创建多个变量

在GG图中绘制射线的自动程序

如何在R中改变fviz_pca_biplot中圆的边界线的 colored颜色 ?

优化从每个面的栅格中提取值

减少雨云面之间的间距并绘制所有统计数据点

数据集上的R循环和存储模型系数

R-使用stri_trans_General()将其音译为德语字母

如何在R中创建这些列?

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

Broom.Mixed::Augment不适用于Sample::分析

如何修改GT表中组名行的 colored颜色 ?

通过比较来自多个数据框的值和R中的条件来添加新列

图中显示错误 colored颜色 的图例geom_sf

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串

使用grepl过滤特定列范围内的列名