2016-04-22 101 views
2

我想用整个第二矢量替换矢量的几个元素。条件是,代替第一个向量的元素等于第三个向量。这里有一个例子:用R中的矢量替换矢量的元素

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 

但有一点成功。谁能帮忙?

回答

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

这里另一种选择:

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)