如果使用快速应用函数满足条件,则尝试替换向量中的值,但是语法很难。
v1 <- c(-18,-18,-19,-20,-18,-18,-19)
v2 <- c(34, 7, 8, 9, 7, 10, 30)
我想比较每个向量中的元素,如果v1小于-v2,则将其替换为v2值。我可以轻松地识别出那些需要更换的东西:
v1 < (-v2)
[1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE
我尝试使用此mapply函数,但出现以下错误
v1 <- mapply(function(x) if (x< (-v2)) (-v2) else x, v1)
Warning messages:
1: In if (x < (-v2)) (-v2) else x :
the condition has length > 1 and only the first element will be used
2: In if (x < (-v2)) (-v2) else x :
the condition has length > 1 and only the first element will be used
我认为这是因为我并不是在具体说要按顺序比较元素,所以它仅使用其中一个向量的第一个元素,但是我不确定如何这样做。顺便说一句,我知道我可以使用for循环来做到这一点,但是由于数据集非常大,我试图避免这种情况。预先感谢。
更新:我也尝试过此操作,但出现了新错误
v1 <- mapply(function(i) if(v1[i]< (-v2[i]) (-v2[i]) else v1[i], seq_along(v1))
Error: unexpected 'else' in "v1 <- sapply(function(i) if(v1[i]< (-v2[i]) (-v2[i]) else"
答案 0 :(得分:1)
您不需要为此循环。这样就可以了:
v1 [v1 <(-v2)] <-v2 [v1 <(-v2)]。
注意:您必须确保两个向量的长度相等,否则在比较v1 <(-v2)时R将默认延长较短的一个,子集将给您带来无意义的结果。
答案 1 :(得分:1)
在mapply
中,您可以将函数应用于多个参数。在您的情况下,您的函数应采用两个变量,例如:
v1 <- mapply(function(x,y) if (x < (-y)) (-y) else x, v1, v2)
v1
#[1] -18 -7 -8 -9 -7 -10 -19
正如Grada Gukovic所写,不需要循环。在答案中,仅缺少-
:
v1[v1 < (-v2)] <- -v2[v1 < (-v2)]
v1
#[1] -18 -7 -8 -9 -7 -10 -19