查找的束缚因素-这是最有效的方法吗?

问题描述 投票:0回答:2

我有两个要用作查找表的因素:

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      

这是将这些因素链接在一起的最有效执行时间的方法吗?还是有更好的方法?

r processing-efficiency
2个回答
0
投票

可能不是很快,特别是由于使用了函数%>%na_if()

我不确定这是否是最快的方法,但是如果您只是将sCapiState设为原子矢量而不是列表(使用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]])

0
投票

如果使用查找向量而不是查找列表,则可以做得更好。基本上,我将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
© www.soinside.com 2019 - 2024. All rights reserved.