带有if语句的for循环(都遍历列表)在r中给出警告

8cdiaqws  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(158)

我有两个列表,每个列表包含两个向量,即,

x <- list(c(1,2),c(3,4))
y <- list(c(2,4),c(5,6))
z <- list(c(0,0),c(1,1), c(2,3),c(4,5))

我想使用for循环迭代第一个列表,并使用if语句迭代第二个列表,如下所示:

for (j in 1:seq(x)){
      if(y[[j]] == c(2,4))
        z[[j]] <- c(0,0)
    }

我想迭代第一个列表,每次迭代我想给予第二个列表一个条件,我的函数很复杂,所以我上传了这个例子,它和我试图用我的原始函数做的很相似,也就是说,我想根据y的值来选择z的值。对于x,我只想根据x的长度来运行代码。
当我运行它的时候,我得到了这个消息:

Warning messages:
1: In 1:seq(x) : numerical expression has 2 elements: only the first used
2: In if (y[[j]] == c(2, 4)) y[[j]] <- c(0, 0) :
  the condition has length > 1 and only the first element will be used

我搜索这个网站,我看到类似的问题,但它是没有帮助的(if loop inside a for loop which iterates over a list in R?)。这个问题只是我的问题的第一部分。所以,它没有帮助我解决我的问题。
有什么需要帮忙的吗?

zyfwsgd6

zyfwsgd61#

第一个警告是由于使用seq()(返回[1] 1 2)和冒号运算符(创建LHS和RHS之间的序列)引起的。冒号左右两边的值的长度都必须为1。否则,它将获取第一个元素并丢弃其余元素。因此,1:seq(x)与写入1:1相同
第二个警告是if语句从您的条件中获取2个逻辑值:

y[[1]] == c(2, 4)
[1] TRUE TRUE

如果你想测试向量的元素是否相同,你可以使用你的符号;如果你想测试向量是否相同,你可以使用all.equal

isTRUE(all.equal(y[[1]], c(2,4)))
[1] TRUE

如果向量相等,则返回TRUE(如果不相等,则不返回FALSE,这就是需要与isTRUE()沿着使用的原因)。
要消除警告,您可以执行以下操作:

for (j in seq_along(x)){
  if (isTRUE(all.equal(y[[j]], c(2,4)))) {
    z[[j]] <- c(0,0)
  }
}

注意:seq_along()seq()的快速原语

piztneat

piztneat2#

对于第一部分,seq()将返回[1] 1 2。因此,您需要使用j in seq(x)j in 1:length(x)。对于第二部分,由于您使用的命令生成的TRUEFALSE与向量中的元素一样多,因此您可以使用setequal(x,y)。此命令将检查两个对象是否相等。两个对象可以是向量, Dataframe 等,结果为TRUEFALSE。最终代码可以是:

for (j in 1:length(x)){
  if (setequal(y[[j]], c(2,4)) == TRUE) {
    z[[j]] <- c(0,0)
  }
}

或:

for (j in seq(x)){
  if (setequal(y[[j]], c(2,4)) == TRUE) {
    z[[j]] <- c(0,0)
  }
}

相关问题