不一致的匹配函数,如果我 运行 两次有效 (R)

Inconsistent match function, if I run twice works (R)

我正在尝试根据另一个向量 trade_order.

使用它的名称对数值向量 current_qty 重新排序

经过简单的匹配,他们给了我一些奇怪的安排。

current_qty <- getQuantity(trades)
print(names(current_qty))
[1] "ivvb11"       "lft20210301"  "ltn20180101"  "ntnb20200815" "pibb11"      
print(trade_order)
[1] "pibb11"       "ivvb11"       "lft20210301"  "ntnb20200815" "ltn20180101" 
current_qty <- current_qty[match(names(current_qty), trade_order)]
print(current_qty)
lft20210301  ltn20180101     pibb11 ntnb20200815       ivvb11 
     2.15        42.59        50.00         3.89        60.00 

现在是有趣的部分。如果我运行相同的匹配函数两次。有效。

current_qty <- getQuantity(trades)
print(names(current_qty))
[1] "ivvb11"       "lft20210301"  "ltn20180101"  "ntnb20200815" "pibb11"      
print(trade_order)
[1] "pibb11"       "ivvb11"       "lft20210301"  "ntnb20200815" "ltn20180101" 
current_qty <- current_qty[match(names(current_qty), trade_order)]
current_qty <- current_qty[match(names(current_qty), trade_order)]
print(current_qty)
pibb11       ivvb11  lft20210301 ntnb20200815  ltn20180101 
50.00        60.00         2.15         3.89        42.59 

我做错了什么?还有其他方法吗?

来自 help(match):

"match returns a vector of the positions of (first) matches of its first argument in its second."

所以它查看 names(current_qty) 中的每个元素和 returns 它在 trade_order 中的位置。因此,例如它在 trade_order 的第二个位置看到 "ivvb11"。然后这会传递给您的子集,在那里它会重新排序。所以这将做的是它将 current_qty ("lft20210301") 的位置 2 中的元素移动到第一个位置。

因此,您可以看到,您应该颠倒传递给 match 的参数的顺序,这样就没问题了:

current_qty[match(trade_order, names(current_qty))]