让
vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
有什么可能,所以我可以进行以下交换? 交换:
-->
3 -->
4 -->
2 -->
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
它不起作用。你能帮我一把吗?
答案 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)