2016-03-09 8 views
0

У меня есть вектор v = c("abc", "csb", "csfd", "dds", "edds") строк. Я хочу, чтобы производить все возможные комбинации меньше или равна длине п с использованием элементов вектора V.Поиск всей возможной комбинации вектора

Я попытался combn функцию, которая дала результат что-то вроде этого

>>combn(v,2) 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] "abc" "abc" "abc" "abc" "csb" "csb" "csb" "csfd" "csfd" "dds" 
[2,] "csb" "csfd" "dds" "edds" "csfd" "dds" "edds" "dds" "edds" "edds" 

Но я хочу сочетание повторяющихся строк и более низкий срок. Например, если n = 2, то выход должен быть равен

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] "abc" "csb" "csfd" "dds" "edds" "abc" "abc" "abc" "abc" " csb" 
[2,] ""  ""  "" "" "" "abc" "csb" "csfd" "edds" "edds" 

и другие условия.

+1

Попробуйте 'п <- 2; lapply (seq (n), function (i) combn (v, i)) ' – akrun

+0

Если решение ниже рассмотрит вопрос о принятии решения, щелкнув галочку рядом с голосованием. Изучая ваш профиль, я понимаю, что вы задали 11 вопросов в прошлом и не приняли решения по любым из ваших вопросов. Есть ли причина? – akrun

ответ

1

Мы цикл через последовательность «N» с lapply, указать «M» в combn как петельные значения, получают транспонированную combn выхода, преобразовывать в data.frame, а затем rbind элементы list использованием rbindlist (от data.table) с fill=TRUE.

library(data.table) 
n <- 2 
lst <- lapply(seq(n), function(i) as.data.frame(t(combn(v,i)))) 
rbindlist(lst, fill=TRUE) 
#  V1 V2 
# 1: abc NA 
# 2: csb NA 
# 3: csfd NA 
# 4: dds NA 
# 5: edds NA 
# 6: abc csb 
# 7: abc csfd 
# 8: abc dds 
# 9: abc edds 
#10: csb csfd 
#11: csb dds 
#12: csb edds 
#13: csfd dds 
#14: csfd edds 
#15: dds edds 

Если нам нужны все эти комбинации используют expand.grid

lst <- lapply(seq(n), function(i) expand.grid(rep(list(v), i))) 
rbindlist(lst, fill=TRUE) 
# Var1 Var2 
# 1: abc NA 
# 2: csb NA 
# 3: csfd NA 
# 4: dds NA 
# 5: edds NA 
# 6: abc abc 
# 7: csb abc 
# 8: csfd abc 
# 9: dds abc 
#10: edds abc 
#11: abc csb 
#12: csb csb 
#13: csfd csb 
#14: dds csb 
#15: edds csb 
#16: abc csfd 
#17: csb csfd 
#18: csfd csfd 
#19: dds csfd 
#20: edds csfd 
#21: abc dds 
#22: csb dds 
#23: csfd dds 
#24: dds dds 
#25: edds dds 
#26: abc edds 
#27: csb edds 
#28: csfd edds 
#29: dds edds 
#30: edds edds 
+0

Но это не содержит повторяющихся терминов, таких как abc и abc и т. Д. См. 6-й столбец в желаемом выходе. – Rajan

+1

@ Rajan Хорошо, это справедливо, но есть еще 10 других заданий, которые вы просили, и вы их не приняли. – akrun

+0

@ Rajan Можете ли вы проверить обновленное сообщение – akrun

Смежные вопросы