字符向量组合列表

var*_*ble 4 combinations r

我正在尝试使用具有四个可能模型"x1","x2","x3","x4"的名称的向量,并创建这些术语的所有可能排列的更长向量,因此我可以启动一个数据帧各自的属性.

下面的代码看起来应该可以工作但不会.元素不会粘贴在一起,例如"x1"和"x2"组合应该产生"x1x2"模型名称,而是保持"x1""x2".

models <- c("x1","x2","x3","x4")

modelist<- as.character()
for(i in 1:4){
  modelist <- c(modelist,combn(models,m=i,FUN=paste0,simplify = T))
}
modelist
Run Code Online (Sandbox Code Playgroud)

由于我不是在寻找交互条件,x1x1不应该出现,但我有兴趣知道如何做到这两种方式以供将来参考.

这是我正在寻找的输出:

modelist <- c("x1","x2","x3","x4","x1x2","x1x3","x1x4","x2x3","x2x4","x3x4",
            "x1x2x3","x2x3x4","x1x2x4","x1x3x4","x1x2x3x4")
Run Code Online (Sandbox Code Playgroud)

这就是模型师应该包含的内容.

Ric*_*ven 5

paste()使用其默认参数,以及使用sep = "",将不起作用,因为结果来自combn()原子矢量,但对于每个组合.因此,对于每种组合,它基本上与以下相同.

paste(letters[1:4])
# [1] "a" "b" "c" "d"
paste(letters[1:4], sep = "")
# [1] "a" "b" "c" "d"
paste(letters[1:4], collapse = "")
# [1] "abcd"
Run Code Online (Sandbox Code Playgroud)

所以,你将要使用collapse = ""paste().这是一个lapply()解决方案.

unlist(lapply(1:4, function(i) combn(models, i, paste, collapse = "")))
#  [1] "x1"       "x2"       "x3"       "x4"       "x1x2"     "x1x3"     "x1x4"
#  [8] "x2x3"     "x2x4"     "x3x4"     "x1x2x3"   "x1x2x4"   "x1x3x4"   "x2x3x4"
# [15] "x1x2x3x4"
Run Code Online (Sandbox Code Playgroud)

如果你想继续使用for()循环,我建议你分配一个列表而不是在循环中构建字符向量.效率更高.你可以分配一个长度的字符向量sum(choose(4, 1:4)),但是循环索引有点棘手,并且列出的列表比担心所有这些要容易得多.此外,列表是处理不同长度的类似对象时使用的标准结构.

modlist <- vector("list", 4)
for(i in 1:4) {
    modlist[[i]] <- combn(models, i, paste, collapse = "")
}
unlist(modlist)
#  [1] "x1"       "x2"       "x3"       "x4"       "x1x2"     "x1x3"     "x1x4"
#  [8] "x2x3"     "x2x4"     "x3x4"     "x1x2x3"   "x1x2x4"   "x1x3x4"   "x2x3x4"
# [15] "x1x2x3x4"
Run Code Online (Sandbox Code Playgroud)