如何交换(翻译)向量内的值

How to swap (translate) values inside a vector

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)

我可以进行以下交换的可能性有哪些? 交换:

我试过这个:

vetB <- as.factor(vetA)
levels(vetB) <- c(3,4,2,1)
vetA <- as.integer(vetB)

# because
print(vetB)
# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1
#Levels: 3 4 2 1

没用。你能帮我一下吗?

一个可能的选择是使用 match:

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
old=c(1,2,3,4)
new=c(3,4,2,1)
new[match(vetA,old)]

输出:

3 4 3 4 3 2 1 3 4 2 4 3 1

希望对您有所帮助!

如果您在将因子向量转换为整数之前将其转换为字符,您的代码将有效。请注意,因子在内部存储为整数,因此 as.integer(vetB) 将 return 其整数级别。

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)

vetB <- as.factor(vetA)
levels(vetB) <- c(3,4,2,1)
vetA <- as.integer(as.character(vetB))
vetA
# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

您可以创建一个查询 table:

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
lookup <- setNames(c(3, 4, 2, 1), 1:4)
lookup[vetA]
## 1 2 1 2 1 3 4 1 2 3 2 1 4 
## 3 4 3 4 3 2 1 3 4 2 4 3 1

lookup的值为新值,名称为旧值。然后,您可以使用向量 vetA 作为索引来选择新值。

由于您替换的值只是 c(1, 2, 3, 4),实际上不需要显式设置名称,只需使用

即可获得相同的结果
c(3, 4, 2, 1)[vetA]
## [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

但是,上述解决方案也适用于您替换的值不仅仅是整数序列的情况。

你可以简单地做

new[order(old)][vetA]

# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

哪里

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
old <- c(1,2,3,4)
new <- c(3,4,2,1)

注意:即使向量 old 排序,这也会起作用——以及@Florian 接受的答案。在这种情况下,其他两个答案将不起作用。例如如果

old <- c(3,2,1,4)
new <- c(3,4,2,1)