按向量 B 对命名向量 A 的值进行排序,但尽可能保持名称的顺序

Sort values of named vector A by vector B but keeping the order of names where possible

我有一个这样的命名向量:

my_vec <- c("Max"= "England", "Manfred"= "Germany", "Ingolf"= "Germany", "Paul"= "England", "Peter"= "Germany", "Nina"= "Italy")

我需要按照另一个向量中指定的国家/地区对该向量进行排序,同时保持给定国家/地区的人员顺序与以前一样。所以如果国家的顺序是...

sort_scheme <- c("England", "Germany", "Italy")

...那么我想要的输出是:

goal_vec <- c("Max"= "England", "Paul"= "England", "Manfred"= "Germany", "Ingolf"= "Germany", "Peter"= "Germany", "Nina"= "Italy")

如您所见,所需的输出具有与 sort_scheme 中相同的国家顺序(首先是英国,然后是德国,然后是意大利),并且在一个国家内,名称的原始顺序是相同的(对于England Max 排在第一位,然后是 Paul,依此类推)。该解决方案对于具有基数 R 的其他字符(新名称和国家/地区)应该是灵活的。我想出的一切都非常麻烦。

编辑 我发现这是一个 duplicate 并投票关闭。

对命名值进行排序会按向量的值而不是其名称对向量进行排序。假设您的 sort_scheme 是按字母顺序从 A-Z 开始的,您只需在矢量上使用 sort

sort(my_vec)
#       Max      Paul   Manfred    Ingolf     Peter      Nina 
# "England" "England" "Germany" "Germany" "Germany"   "Italy" 

我们可以使用order:

my_vec[order(match(my_vec, sort_scheme))]

      Max      Paul   Manfred    Ingolf     Peter      Nina 
"England" "England" "Germany" "Germany" "Germany"   "Italy" 

根据@MerijnvanTilborg - 如果需要使用矢量名称进行“嵌套”排序(OP 中不是这种情况),我们可以使用: my_vec[order(match(my_vec, sort_scheme), names(my_vec))]

参见?order

In the case of ties in the first vector, values in the second are used to break the ties.