簡體   English   中英

R中的特定序列創建

[英]Specific sequence creation in R

我想以一種聰明的方式創建以下序列,而不是對其進行硬編碼:

'0-0-0-0-0-0'
'0-1-0-0-0-0'
'0-0-1-0-0-0'
'0-0-0-1-0-0'
'0-0-0-0-1-0'
'0-0-0-0-0-1'
'1-0-0-0-0-0'
'1-1-0-0-0-0'
'1-0-1-0-0-0'
'1-0-0-1-0-0'
'1-0-0-0-1-0'
'1-0-0-0-0-1'
'1-1-1-1-1-1'
'2-0-0-0-0-0'
'2-1-0-0-0-0'
'2-0-1-0-0-0'
'2-0-0-1-0-0'
'2-0-0-0-1-0'
'2-0-0-0-0-1'
'3-0-0-0-0-0'
'3-1-0-0-0-0'
'3-0-1-0-0-0'
'3-0-0-1-0-0'
'3-0-0-0-1-0'
'3-0-0-0-0-1'
'0-2-0-0-0-0'
'0-0-2-0-0-0'
'0-0-0-2-0-0'
'0-0-0-0-2-0'
'0-0-0-0-0-2'
 and so on...

詳細說明呈現的模式的詳細信息:我有4個狀態{0,1,2,3}並且我想找到length=6序列的所有可能組合,從任何狀態開始,僅允許一個中間要在下一個位置中出現的序列的位置。

這是一種方法。 我為每個序列生成了一個簡單的描述,然后構建序列(並刪除重復項,因為所有中間值為0,所以需要這樣做)。

dd = expand.grid(first = 0:3, inter_value = 0:3, inter_position = 2:6)

result = t(apply(dd, 1, function(x) {
  z = c(x["first"], rep(0L, 5))
  z[x["inter_position"]] = x["inter_value"]
  z
}))

result = result[!duplicated(result), ]

dim(result)
# [1] 64  6
head(result, 10)
#       first          
#  [1,]     0 0 0 0 0 0
#  [2,]     1 0 0 0 0 0
#  [3,]     2 0 0 0 0 0
#  [4,]     3 0 0 0 0 0
#  [5,]     0 1 0 0 0 0
#  [6,]     1 1 0 0 0 0
#  [7,]     2 1 0 0 0 0
#  [8,]     3 1 0 0 0 0
#  [9,]     0 2 0 0 0 0
# [10,]     1 2 0 0 0 0

破折號:

apply(result, 1, paste, collapse = "-")
#  [1] "0-0-0-0-0-0" "1-0-0-0-0-0" "2-0-0-0-0-0" "3-0-0-0-0-0" "0-1-0-0-0-0" "1-1-0-0-0-0" "2-1-0-0-0-0"
#  [8] "3-1-0-0-0-0" "0-2-0-0-0-0" "1-2-0-0-0-0" "2-2-0-0-0-0" "3-2-0-0-0-0" "0-3-0-0-0-0" "1-3-0-0-0-0"
# [15] "2-3-0-0-0-0" "3-3-0-0-0-0" "0-0-1-0-0-0" "1-0-1-0-0-0" "2-0-1-0-0-0" "3-0-1-0-0-0" "0-0-2-0-0-0"
# [22] "1-0-2-0-0-0" "2-0-2-0-0-0" "3-0-2-0-0-0" "0-0-3-0-0-0" "1-0-3-0-0-0" "2-0-3-0-0-0" "3-0-3-0-0-0"
# [29] "0-0-0-1-0-0" "1-0-0-1-0-0" "2-0-0-1-0-0" "3-0-0-1-0-0" "0-0-0-2-0-0" "1-0-0-2-0-0" "2-0-0-2-0-0"
# [36] "3-0-0-2-0-0" "0-0-0-3-0-0" "1-0-0-3-0-0" "2-0-0-3-0-0" "3-0-0-3-0-0" "0-0-0-0-1-0" "1-0-0-0-1-0"
# [43] "2-0-0-0-1-0" "3-0-0-0-1-0" "0-0-0-0-2-0" "1-0-0-0-2-0" "2-0-0-0-2-0" "3-0-0-0-2-0" "0-0-0-0-3-0"
# [50] "1-0-0-0-3-0" "2-0-0-0-3-0" "3-0-0-0-3-0" "0-0-0-0-0-1" "1-0-0-0-0-1" "2-0-0-0-0-1" "3-0-0-0-0-1"
# [57] "0-0-0-0-0-2" "1-0-0-0-0-2" "2-0-0-0-0-2" "3-0-0-0-0-2" "0-0-0-0-0-3" "1-0-0-0-0-3" "2-0-0-0-0-3"
# [64] "3-0-0-0-0-3"

這是一個通用的嵌套for循環解決方案。 並不是世界上最高效的,但是可以獲得理想的結果(注意:您可以更改states和/或sequence_len ,並且序列將自動生成):

states <- 0:3
states_len <- length(states)
sequence_len <- 6
sequence_mat <- matrix(0, states_len*{{states_len-1}*{sequence_len-1}+1}, sequence_len)
rw <- 1
for(ii in states){
  for(jj in states){
    for(kk in 2:sequence_len){
      if(jj != 0){
        rw = rw + 1
      }
      sequence_mat[rw, 1] <- ii
      sequence_mat[rw, kk] <- jj
      if(jj == rev(states)[1] && kk == sequence_len){
        rw = rw + 1
      }
    }
  }
}

輸出:

> head(sequence_mat, 20)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    0    0    0    0    0    0
 [2,]    0    1    0    0    0    0
 [3,]    0    0    1    0    0    0
 [4,]    0    0    0    1    0    0
 [5,]    0    0    0    0    1    0
 [6,]    0    0    0    0    0    1
 [7,]    0    2    0    0    0    0
 [8,]    0    0    2    0    0    0
 [9,]    0    0    0    2    0    0
[10,]    0    0    0    0    2    0
[11,]    0    0    0    0    0    2
[12,]    0    3    0    0    0    0
[13,]    0    0    3    0    0    0
[14,]    0    0    0    3    0    0
[15,]    0    0    0    0    3    0
[16,]    0    0    0    0    0    3
[17,]    1    0    0    0    0    0
[18,]    1    1    0    0    0    0
[19,]    1    0    1    0    0    0
[20,]    1    0    0    1    0    0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM