2015-07-29 2 views
3

Как создать цикл for в R, который учитывает две переменные?R - Несколько переменных для цикла?

Что-то вроде:

for(i in 1:10, j in 1:10) { 
if vector[j] == vector2[i] 
print(variable) 
else print(NA) } 

Это должно дать мне 100 выходов, в отличие от использования

vector[i] == vector[i] 

, который будет генерировать 10.

EDIT: Спасибо за йор помощь до сих пор , вот мои фактические данные:

for(i in 1:10) { 
    for(j in 1:10) { 
     if (i == j) 
     print(NA) 
     else if(st231_eq1_alg$Output[j] == st231_eq1_alg$Input[i]) 
     print(st231_eq1_alg_f[i]) 
     else if(st231_eq1_alg$Output[j] == st231_eq1_alg$Output[i]) 
     print(st231_eq1_alg_inv_f[i]) 
     else print(NA) 
    } 
} 

Любые идеи о том, как лучше всего представлять эти выходы? Еще раз спасибо.

ответ

1

Вы можете сделать это с вложенными для петель:

for (i in 1:10) { 
    for (j in 1:10) { 
    # Your logic in here 
    } 
} 
+0

ах просто спасибо! :) – Charlie

3

Похоже, вы спрашиваете о вложенной для цикла

for (i in 1:10){ 
    for(j in 1:10){ 
    ... 
    } 
} 

Но я бы рекомендовал другой подход

Vectors <- expand.grid(vector1 = vector1, 
         vector2 = vector2) 
Vectors$comparison <- with(Vectors, vector1 == vector2) 
+0

Мне нравится избегать вложенных циклов, когда я могу прокручивать результат 'expand.grid'; В этом случае я бы 'for (i в 1: nrow (Vectors)) {IDs <- Векторы [i,]}', например. – rbatt

+0

Я согласен с вами, но для моей фактической задачи я хочу, чтобы вещи (соответствующие информации другому вектору) печатались (см. Оригинальное редактирование сообщения). – Charlie

1

Ваш код работает, если вы пишете два вложенных цикла:

for(i in 1:10} { 
    for (j in 1:10) { 
    if vector[j] == vector2[i] 
    print(variable) 
    else 
    print(NA) 
} 
} 

Следующий пример показывает другую возможность получить этот результат более быстро:

set.seed(1234) 
vector <- sample(20,10) 
vector2 <- sample(20,10) 
same <- vector[vector %in% vector2] 
m <- matrix(NA,ncol=10,nrow=10) 
for (i in 1:length(same)) m[vector==same[i], vector2==same[i]] <- same[i] 
#> vector 
# [1] 3 12 11 18 14 10 1 4 8 6 
#> vector2 
# [1] 14 11 6 16 5 13 17 4 3 12 
#> m 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] NA NA NA NA NA NA NA NA 3 NA 
# [2,] NA NA NA NA NA NA NA NA NA 12 
# [3,] NA 11 NA NA NA NA NA NA NA NA 
# [4,] NA NA NA NA NA NA NA NA NA NA 
# [5,] 14 NA NA NA NA NA NA NA NA NA 
# [6,] NA NA NA NA NA NA NA NA NA NA 
# [7,] NA NA NA NA NA NA NA NA NA NA 
# [8,] NA NA NA NA NA NA NA 4 NA NA 
# [9,] NA NA NA NA NA NA NA NA NA NA 
#[10,] NA NA 6 NA NA NA NA NA NA NA 
#> same 
#[1] 3 12 11 14 4 6 

Преимущество здесь у вас есть только один небольшой цикл, который работает только на тех записях, которые равны в обоих векторов (шесть чисел в этом случае), вместо вложенных циклов, которые пробегают все 100 записей матрицы.

Если вы хотите напечатать записи этой матрицы последовательно, как в ваших вложенных циклов, вы можете ввести:

print(c(m)) 

Что касается изменений, связанных с вашим редактирования беспокоит, я полагаю, что это должно работа:

same1 <- st231_eq1_alg$Output[st231_eq1_alg$Output %in% st231_eq1_alg$Input] 
idx2 <- which(duplicated(st231_eq1_alg$Output)) 
same2 <- st231_eq1_alg$Output[idx2] 
m <- matrix(NA, ncol = 10, nrow = 10) 
for(i in 1:length(same1)) m[st231_eq1_alg$Output==same1[i], st231_eq1_alg$Input==same1[i]] <- same1[i] 
for(i in 1:length(same2)) m[st231_eq1_alg$Output==same2[i], st231_eq1_alg$Output==same2[i]] <- st231_eq1_alg_inv_f[idx2[i]] 
print(c(m)) 
2

Вы можете использовать outer, чтобы выполнить это и получить матрицу 10x10 с результатами:

vector <- 1:10 
vector2 <- sample(vector) 
outer(vector,vector2,"==") 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 
[2,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[3,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
[4,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE 
[5,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[6,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[7,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 
[8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE 
[9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE 
[10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE 
Смежные вопросы