如何交换(翻译)向量内的值
How to swap (translate) values inside a vector
让
vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
我可以进行以下交换的可能性有哪些?
交换:
- 1
-->
3
- 2
-->
4
- 3
-->
2
- 4
-->
1
我试过这个:
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)
让
vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
我可以进行以下交换的可能性有哪些? 交换:
- 1
-->
3 - 2
-->
4 - 3
-->
2 - 4
-->
1
我试过这个:
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)