基于另一个向量替换向量中的值

Rom*_*rik 14 replace r

我想x用另一个vector(y)中的值替换vector()中的值.捕获22:方法需要是动态的,以适应向量中不同数量的"级别" x.例如,考虑矢量x

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE)
> x
  [1] 2 4 1 1 3 1 1 1 1 1 2 2 5 5 4 5 5 3 4 1 2 2 3 3 3 5 1 3 4 5 5 3 2 4 3 1 3
 [38] 1 4 5 4 1 4 5 4 5 2 4 2 5 3 4 3 1 2 1 1 5 1 4 2 2 5 2 2 4 5 2 4 5 2 5 4 1
 [75] 3 3 4 4 1 1 4 4 2 4 5 4 5 5 4 2 5 2 4 5 3 2 1 1 2 2
Run Code Online (Sandbox Code Playgroud)

我想用100替换1s,用200替换2s等等.

这可以通过for循环轻松完成,但对于大型向量,数十万个值,这是非常低效的.如何优化代码的任何提示?

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE)
y <- c(100, 200, 300, 400, 500)
x.lvl <- c(1, 2, 3, 4, 5)
x.temp <- x

for (i in 1:length(y)) {
    x.temp[which(x == x.lvl[i])] <- y[i]
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rek 17

试试吧 match

y[match(x, x.lvl)]
Run Code Online (Sandbox Code Playgroud)

  • @Mahbub在这种情况下是,但通常你需要匹配(例如,如果`x`是字母向量).检查以下评论VitoshKa答案. (5认同)

Vit*_*hKa 9

使用因素可能会更快:

xf <- as.factor(x)
y[xf]
Run Code Online (Sandbox Code Playgroud)

注意,它levels(xf)为您提供了与x.lvl类似的字符向量.因此,为了使这种方法起作用,y的元素应该对应于适当的元素levels(xf).

  • 在玩具示例中,您甚至可以使用y [x] (2认同)
  • 或者,只是x*100 :) (2认同)
  • 使用匹配,正如Marek提出的那样是一种通用的方法,并且不需要转换为因子.你的x向量只包含从1到N的数字,所以你可以使用y [x]中的位置匹配,这只是幸运的巧合. (2认同)