Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果满足条件,如何跳过for循环中的迭代_R_Loops_Iteration_Skip - Fatal编程技术网

如果满足条件,如何跳过for循环中的迭代

如果满足条件,如何跳过for循环中的迭代,r,loops,iteration,skip,R,Loops,Iteration,Skip,我有代码把一个矩阵的上三角变成一个向量,并把这个向量的值和它们在矩阵中的原始坐标一起存储到一个数据帧中。 如果向量中的元素为零,如何跳过for循环 我尝试过其他的陈述和尝试 v <- matrix(sample(0:1, 10, replace = TRUE),9,9) t <- v[upper.tri(v,diag=T)] tful <- t[t!=0] df <- data.frame(FP1=rep(0,length(t)),FP2=rep(0,length(t))

我有代码把一个矩阵的上三角变成一个向量,并把这个向量的值和它们在矩阵中的原始坐标一起存储到一个数据帧中。 如果向量中的元素为零,如何跳过for循环

我尝试过其他的陈述和尝试

v <- matrix(sample(0:1, 10, replace = TRUE),9,9)
t <- v[upper.tri(v,diag=T)]
tful <- t[t!=0]
df <- data.frame(FP1=rep(0,length(t)),FP2=rep(0,length(t)),tanimoto=rep(0,length(t)))
for (i in 1:length(t)){
  if (t[i]==0) next
  else {
      col_num <- floor(sqrt(2*i-7/4)+.5)
      row_num <- i-(.5*col_num^2-.5*col_num+1)+1
      df$FP1[i] <- row_num
      df$FP2[i] <- col_num
      df$tanimoto[i] <- v[row_num,col_num]
    }
}

v您的
next
可以跳过循环的当前迭代

最终结果仍然是0,因为
df
的所有值都已初始化为0。当您跳过迭代时,它们不会更改,因此它们保持为0。如果将初始化更改为NA值,您将看到没有添加0

df <- data.frame(FP1=rep(NA,length(t)),FP2=rep(NA,length(t)),tanimoto=rep(NA,length(t)))
for (i in 1:length(t)){
  if (t[i]==0) next
  else {
      col_num <- floor(sqrt(2*i-7/4)+.5)
      row_num <- i-(.5*col_num^2-.5*col_num+1)+1
      df$FP1[i] <- row_num
      df$FP2[i] <- col_num
      df$tanimoto[i] <- v[row_num,col_num]
    }
}
df
#    FP1 FP2 tanimoto
# 1    1   1        1
# 2    1   2        1
# 3    2   2        1
# 4    1   3        1
# 5    2   3        1
# 6    3   3        1
# 7   NA  NA       NA
# 8    2   4        1
# 9    3   4        1
# 10   4   4        1
# 11  NA  NA       NA
# ...

当矩阵的对角线成为向量时,row_num和col_num给出了向量元素在原始矩阵中的坐标。对于一些简单的东西来说,这似乎是一个非常复杂的公式——我会小心bug或边缘情况。非循环方法对我来说更清晰,因此感觉更安全。(可能效率也更高)我同意。我有一个很大的矩阵,你的代码立即完成了我想要它做的事情。我的循环花了很长时间。再次感谢。
v1 = v != 0 
df2 = data.frame(FP1 = row(v)[v1], FP2 = col(v)[v1], tanimoto = v[v1])
df2 = subset(df2, FP1 <= FP2)
df2
#    FP1 FP2 tanimoto
# 1    1   1        1
# 7    1   2        1
# 8    2   2        1
# 13   1   3        1
# 14   2   3        1
# 15   3   3        1
# 20   2   4        1
# 21   3   4        1
# 22   4   4        1
# 27   3   5        1
# 28   4   5        1
# 29   5   5        1
# 33   1   6        1
# 34   4   6        1
# 35   5   6        1
# ...