我想用整个第二个向量替换向量的少数元素。条件是,第一个向量的替换元素等于第三个向量。这是一个例子:
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
但取得了一点成功。有人可以帮忙吗?
答案 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中描述的示例中,向量a
和b
中有三个常见数字,而v <- rnorm(2, mean = 1, sd = 5)
只包含2个数字,矢量v
将被回收并发出警告。
可以通过将v
定义为
v <- rnorm(sum(a %in% b), mean = 1, sd = 5)