我有两个向量a&湾
a <- c(1,0,1,0,0,0,1)
b <- c(.2,.9,.3,.9,.8,.78,.3)
我希望从b中与a中的1的索引相对应的所有值中减去1。我可以通过执行which(a == 1)
来提取a中所有值的索引。我尝试过像b <- 1 - b[which(a == 1)]
这样的事情,但这并没有奏效。有没有办法在不使用for循环的情况下执行此操作?
答案 0 :(得分:4)
我们可以通过双重否定(!!
- 将1转换为TRUE和0转换为FALSE)将二进制向量'a'转换为逻辑或通过仅用as.logical
包装或者在OP的代码中转换( a==1
)。这将在'a'中对应于TRUE / 1的'b'中的值进行子集化。从这些值中减去1并将输出分配回'b'
b[a==1] <- 1 - b[a==1]
或者我们可以使用ifelse
ifelse(a==1, 1-b, b)
在OP的代码中,不需要用which
包装,并且用“b”元素的子集分配给'b'用子集'b'替换原始向量'b'
答案 1 :(得分:4)
你的a
向量是0和1。如果您想在b
为1时从a
减去1,并且只要b
为0,就不会从a
做任何事情(也就是减去0 )那么这只是减法:
b - a
如果您的a
向量的值不是0或1,那么您需要一个稍微更复杂,更通用的方法,如@ akrun的答案。
另一个“更复杂”的变体会使用TRUE
的隐含含义1和FALSE
作为0来执行
b - (a == 1)
重新阅读后,您可能需要澄清您想要的内容。您的文字说明从b 中的所有值中减去1,这意味着b - (1 or 0)
。但是,您的代码尝试为1 - b
,从b 中减去 b <1> b ,在这种情况下,akrun的答案是完美的,我需要进行一些调整。< / p>