2016-09-15 9 views
0

Учитывая следующий вектор длины n=10:Extract определенную комбинацию из всех возможных комбинаций в R

# [1] 0 0 0 0 0 1 0 0 1 0 
vec <- c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L) 

Предположим, что мы хотим применить оператор & для всех возможных комбинаций элементов вектора. То есть:

res <- combn(n, 2, function(v) vec[v[1]]&vec[v[2]]) 
# total number of possible combinations is n(n-1)/2 = 45 

Однако мы знаем, что результат & оператора справедливо только тогда, когда оба значения 1 и, следовательно, мы можем сделать это в более умным способом. Фактически, результат combn является вектором длины 45 с одним значением 1, а остальными являются только 0.

Теперь вопрос в том, как мы можем извлечь позицию только 1 без применения самой combn? После того, как мы можем получить его, мы формируем результат просто следующим образом:

res <- rep(0, 45) 
res[index] <- 1 

где index это сомнение положение.

+0

Как 'n' в' combn' функции определены? – Jaap

+1

@Procrastinatus Maximus: 'n = 10' в первой строке. –

ответ

0

Как об этом (в предположении, что только две позиции вектора 1, остальные нули):

vec <- c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L) 

n <- length(vec) 
pos <- which(vec==1) 
index = ifelse(pos[1]==1, 0, sum((n-1):(n-pos[1]+1))) + (pos[2] - pos[1]) 
index 
#[1] 38 

res <- combn(n, 2, function(v) vec[v[1]]&vec[v[2]]) 
which(res==TRUE) 
#[1] 38 
+1

Спасибо @ Ronak, пропустил линию –

+0

Спасибо, но это решение работает только для 'vec'. Не так ли? – 989

+0

Он должен работать для любого vec любой длины, содержащей ровно 2 единицы в любых положениях и отдыхающих всех нулей, я думал, что вы этого хотели. –

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

  • Нет связанных вопросов^_^