for循环使用if语句(都在列表上迭代)在r中给出了警告

时间:2017-10-11 07:03:09

标签: r

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

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

我想迭代第一个列表,并且对于每次迭代,我想为第二个列表提供条件。我的功能很复杂,所以我上传了这个与我原来的功能类似的例子。这就是说,我想根据z的值选择y的值。对于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?)。这个问题仅仅是我的问题的第一部分。所以,它对我的​​问题没有帮助。

有什么帮助吗?

1 个答案:

答案 0 :(得分:4)

第一个警告是由seq()引起的,它[1] 1 2与冒号运算符一起返回1:seq(x),在LHS和RHS之间创建一个序列。冒号左侧和右侧的值都必须为长度1.否则它将占用第一个元素并丢弃其余元素。因此1:1与撰写if

相同

第二个警告是y[[1]] == c(2, 4) [1] TRUE TRUE 语句从你的条件中得到2个逻辑值:

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()Optional.ofNullable(request) .map(Request::getBody) .map(Body::getSections) .orElse(Collections.emptyList()) .stream() .filter(section -> "name".equals(section.getName)) .findFirst();

的快速原语