我有两个列表,每个列表包含两个向量,即,
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?)。这个问题只是我的问题的第一部分。所以,它没有帮助我解决我的问题。
有什么需要帮忙的吗?
2条答案
按热度按时间zyfwsgd61#
第一个警告是由于使用
seq()
(返回[1] 1 2
)和冒号运算符(创建LHS和RHS之间的序列)引起的。冒号左右两边的值的长度都必须为1。否则,它将获取第一个元素并丢弃其余元素。因此,1:seq(x)
与写入1:1
相同第二个警告是
if
语句从您的条件中获取2个逻辑值:如果你想测试向量的元素是否相同,你可以使用你的符号;如果你想测试向量是否相同,你可以使用
all.equal
。如果向量相等,则返回
TRUE
(如果不相等,则不返回FALSE
,这就是需要与isTRUE()
沿着使用的原因)。要消除警告,您可以执行以下操作:
注意:
seq_along()
是seq()
的快速原语piztneat2#
对于第一部分,
seq()
将返回[1] 1 2
。因此,您需要使用j in seq(x)
或j in 1:length(x)
。对于第二部分,由于您使用的命令生成的TRUE
和FALSE
与向量中的元素一样多,因此您可以使用setequal(x,y)
。此命令将检查两个对象是否相等。两个对象可以是向量, Dataframe 等,结果为TRUE
或FALSE
。最终代码可以是:或: