改变特定指数的值 - R.

时间:2016-02-04 17:33:51

标签: r

我有两个向量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循环的情况下执行此操作?

2 个答案:

答案 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>