R -for循环中的多个变量?

eivnm1vs  于 2023-04-09  发布在  其他
关注(0)|答案(6)|浏览(145)

如何在R中创建一个考虑两个变量的for循环?
类似于:

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。
编辑:谢谢你的帮助,以下是我的实际数据:

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)
    }
}

如何最好地表示这些输出?再次感谢。

ergxz8rk

ergxz8rk1#

看起来你是在问一个嵌套的for循环

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

但我会推荐一种不同的方法

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

mmvthczy2#

您可以使用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
mzmfm0qo

mzmfm0qo3#

你可以用嵌套的for循环来实现:

for (i in 1:10) {
  for (j in 1:10) {
    # Your logic in here
  }
}
3b6akqbq

3b6akqbq4#

如果你写了两个嵌套循环,你的代码就可以工作了:

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))
0sgqnhkj

0sgqnhkj5#

我意识到上面的解决方案在i和j相等时有效。对于i和j不相等的情况,我使用下面的代码:

a <- 5 
for(i in 4:6){
  for(j in a:7){
    print(i*j)
    a <- a+1
    break
  }
}

结果是20,30,42

iklwldmw

iklwldmw6#

我发现了一个相当简单的解决方案,如果你想仍然坚持你的For循环,并有多个变量。
你只需要使用循环来调用基于索引的变量,而不是直接调用变量本身。向量需要具有相同的长度。
所以循环看起来像这样:

for (h in 1:length(Vector1)) {

i <- Vector2[h]

j <- Vector3[h]

k <- Vector4[h] ....etc
}

希望有帮助!

相关问题