2015-11-02 29 views
4

我試圖用四個可能的模型名稱「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 

因爲我不是在尋找的互動方面,x1x1不應該出現的,但我很想知道如何以供將來參考做到這一點無論哪種方式。

下面是我在尋找的輸出:

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

這就是應包含在modelist。

+0

用試試吧'崩潰= 「」'作爲'combn(機型,M = 1,FUN =糊狀,崩潰= 「」,簡化= T)' –

+0

做任何你想要刪除嗎?例如。應該出現'x1x1'嗎? –

+0

理查德。 paste0()不起作用,paste()不起作用。然而,你對paste()和collapse =「」的建議似乎已經奏效。這麼奇怪? – variable

回答

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" 

所以你會想在paste()使用collapse = ""。這是一個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" 

如果你想繼續使用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" 
+0

謝謝,全面和翔實的答案。 – variable