在R中用向量替换向量的元素

时间:2016-04-22 12:22:30

标签: r vector replace

我想用整个第二个向量替换向量的少数元素。条件是,第一个向量的替换元素等于第三个向量。这是一个例子:

 a <- 1:10
 b <- 5:7
 v <- rnorm(2, mean = 1, sd = 5)

我的输出应该是

 c(a[1:4], v, a[8:10])

我已经尝试了

 replace(a, a == b, v)
 a[a == b] <- v

但取得了一点成功。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

==运算符最适合用于匹配相同长度的向量,或者当其中一个向量仅为长度为1时。

试试这个,并注意在这两种情况下都没有得到你想要的位置匹配。

> a == b
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Warning message:
In a == b : longer object length is not a multiple of shorter object length
> b == a
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Warning message:
In b == a : longer object length is not a multiple of shorter object length

相反,使用match() - 这会为您提供值中匹配的索引位置。

> match(b, a)
[1] 5 6 7

然后:

a <- 1:10
b <- 5:7
v <- rnorm(3, mean=1, sd=5)

a[match(b, a)] <- v

结果:

a
 [1]  1.0000000  2.0000000  3.0000000  4.0000000 -4.6843669  0.9014578 -0.7601413  8.0000000
 [9]  9.0000000 10.0000000

答案 1 :(得分:1)

下面&#39;另一种选择:

a[a %in% b] <- v

由于在OP中描述的示例中,向量ab中有三个常见数字,而v <- rnorm(2, mean = 1, sd = 5)  只包含2个数字,矢量v将被回收并发出警告。

可以通过将v定义为

来防止警告和回收
v <- rnorm(sum(a %in% b), mean = 1, sd = 5)