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

15

我想要用另一个向量(y)的值来替换向量(x)中的值。困境是:这个方法需要是动态的,以适应向量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

我希望将数字1替换为100,数字2替换为200,以此类推。

使用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]
}
2个回答

19

试试使用match

y[match(x, x.lvl)]

你不需要匹配,只需使用y[x]。 - user855076
5
在这种情况下是需要的,但通常您需要匹配(例如,如果x是字母的向量)。请查看VitoshKa答案下面的评论。 - Marek

9

使用因子可能更快:

xf <- as.factor(x)
y[xf]

请注意,levels(xf)会给出类似于x.lvl的字符向量。因此,为了使该方法有效,y的元素应与levels(xf)的适当元素相对应。

2
在这个玩具示例中,你甚至可以使用 y[x]。 - Joris Meys
完美。即使不将其转换为因子,它也可以正常工作,并检测x是否具有比y预期更多的“级别”。 - Roman Luštrik
2
使用match,就像Marek提出的那样,是一种通用的方法,不需要转换为因子。你的x向量只包含从1到N的数字,所以你可以使用位置匹配,就像y[x]一样,这只是幸运的巧合。 - VitoshKa
也许我应该明确指出,这种方法适用于我的需求,但可能不适用于其他人。感谢您的警告。Marek,您能否修改您的帖子并提到您的方法的普适性? - Roman Luštrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接