2012-07-02 29 views
5

Tôi có một chuỗi có độ dài khác nhau, ví dụ: một cái gì đó như:Tách chuỗi trình tự có độ dài không xác định thành một số bộ nhất định trong R

items <- 1:4 

Tôi muốn chia nó thành mọi tổ hợp có thể là n số bộ. Vì vậy, nói n là hai, tôi muốn quay trở lại:

Set A Set B 
----- ----- 
1  2 3 4 
1 2  3 4 
1 2 3 4 
1 3  2 4 

, vv Việc bố trí trong phạm vi bộ không quan trọng ví dụ: tập {1, 2, 3} cũng giống như {2, 1, 3}. Bộ không được để trống.

tốt nhất tôi có thể đưa ra (sử dụng permn từ gói combinat) là:

n <- 2 
r <- 1:length(items) 
arrangements <- NULL 
for (i in 1:(n-1)) { 
    A <- r[(1:i)] 
    B <- r[-(1:i)] 
    arrangements <- c(arrangements, apply(do.call(rbind, permn(1:length(items))), 1, function(z) list(z[A], z[B]))) 
} 

Đó là khá vô dụng vì nó sẽ trả về bộ mà đều bình đẳng tức là {1, 2, 3} và {2, 1, 3} và không đủ linh hoạt để xử lý các giá trị khác nhau của n. Bất cứ ai có bất kỳ ý tưởng làm thế nào tôi có thể làm điều này? Cảm ơn.

Trả lời

5

Có một 'bộ' gói:

require(sets) 
power_set(1:4) 
sapply(set_power(1:4) , function(x) set_complement(x ,as.set(1:4))) 
list(Set_A = as.list(set_power(1:4)), 
     Set_B = sapply(set_power(1:4) , function(x) set_complement(x ,as.set(1:4)))) 

Nó bao gồm cặp như ({1,2,3,4}, {}) đó là chính xác từ một quan điểm lý thuyết tập hợp, nhưng bạn có thể muốn để loại bỏ chúng là "thoái hóa". (. Cách tại là rõ ràng để khái quát này để N lớn hơn bằng cách làm việc một cách đệ quy vào kết quả Set_B)

1

Dưới đây là một cách khác, có thể giúp bạn:

# Params 
n <- 2 
items <- 1:4 

# Sample 
l <- lapply(items, function(x) combn(items, x, simplify=F)) 
l <-unlist(l, recursive=F) 

# devide into sets 
tmp <- 1:length(l) 
tmp <- split(tmp, sample(1:n, length(l), replace=T)) 

sets <- lapply(tmp, function(x) l[x]) 
Các vấn đề liên quan