如何在向量内交换(转换)值

时间:2018-02-10 18:33:33

标签: r vector swap

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

它不起作用。你能帮我一把吗?

4 个答案:

答案 0 :(得分:9)

如果在将因子向量转换为整数之前将其转换为字符,则代码将起作用。请注意,factor在内部存储为整数,因此as.integer(vetB)将返回其整数级别。

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

答案 1 :(得分:9)

您可以创建一个查找表:

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

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

答案 2 :(得分:8)

一种可能的选择是使用combine

$collection = collect(['name', 'age']);

$combined = $collection->combine(['George', 29]);

$combined->all();

// ['name' => 'George', 'age' => 29]

输出:

match

希望这有帮助!

答案 3 :(得分:5)

你可以简单地做

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)