我有两个要用作查找表的因素:
iState <- list("A" = "Alaska", "T" = "Texas", "G" = "Georgia")
sCap <- list("Alaska" = "Juneau", "Texas" = "Austin", "Georgia" = "Atlanta")
以及要查找的向量:
foo <- c("T", "G", "A", "B", NA)
此代码将它们链接在一起,并给了我所需的查询:
sCap[iState[foo] %>% as.character() %>% na_if("NULL") ] %>% as.character() %>% na_if("NULL")
# [1] "Austin" "Atlanta" "Juneau" NA NA
这是将这些因素链接在一起的最有效执行时间的方法吗?还是有更好的方法?
可能不是很快,特别是由于使用了函数%>%
和na_if()
。
我不确定这是否是最快的方法,但是如果您只是将sCap
和iState
设为原子矢量而不是列表(使用c()
而不是list()
),则可以得到所需的内容非常容易:
iState <- c(A = "Alaska", T = "Texas", G = "Georgia")
sCap <- c(Alaska = "Juneau", Texas = "Austin", Georgia = "Atlanta")
foo <- c("T", "G", "A", "B", NA)
sCap[iState[foo]]
# Texas Georgia Alaska <NA> <NA>
# "Austin" "Atlanta" "Juneau" NA NA
如果未命名结果对您很重要,则可以使用unname()
:
unname(sCap[iState[foo]])
如果使用查找向量而不是查找列表,则可以做得更好。基本上,我将list
更改为c()
,然后切掉所有的as.character
位。
vState <- c("A" = "Alaska", "T" = "Texas", "G" = "Georgia")
vCap <- c("Alaska" = "Juneau", "Texas" = "Austin", "Georgia" = "Atlanta")
vCap[vState[foo]]
microbenchmark::microbenchmark(
lists = sCap[iState[foo] %>% as.character() %>% na_if("NULL") ] %>% as.character() %>% na_if("NULL"),
vectors = unname(vCap[vState[foo]])
)
# Unit: microseconds
# expr min lq mean median uq max neval
# lists 179.0 183.15 263.051 192.80 311.90 1362.8 100
# vectors 2.4 2.80 5.107 3.75 5.45 36.9 100