2017-04-20 574 views
1

如果我需要分別訪問列表中項目的名稱和值,那麼在R中遍歷列表的最有效方法是什麼?高效遍歷R中的列表

如果我嘗試類似:

lst <- list(a = 1, b = 2) 
for(i in lst) { 
    # ... 
} 

然後我只得到了價值和看不到的方式來訪問的名稱。

所以目前我做的:

lst <- list(a = 1, b = 2) 
for(i in names(lst)) { 
    # something with i 
    # something with lst[[i]] 
} 

但因爲我從列表中它的名字,我認爲是上網速度慢的每個項目,這似乎非常低效的給我。爲了避免我可以這樣做:

lst <- list(a = 1, b = 2) 
for(i in seq_along(lst)) { 
    # something with names(lst)[i] 
    # something with lst[[i]] 
} 

但我不知道這是否或多或少有效。

有沒有比這兩者更有效的方法?如果不是,我應該使用哪些?

編輯:

答案this question和@Gladwell給出了另一個建議:

lst <- list(a = 1, b = 2) 
names_lst <- names(lst) 
for(i in seq_along(lst)) { 
    # something with names_lst[i] 
    # something with lst[[i]] 
} 

這是最快的選項?它可以以任何方式改進嗎?

+1

可能重複[訪問樂福內部指數名稱](http://stackoverflow.com/questions/9950144/access-lapply-index-names-inside-fun) –

+0

謝謝,這種方法看起來會更快。我不認爲這是一個重複的問題,但因爲我沒有要求這樣做(我已經知道緩慢的方式)。我想知道最快的方式,並且在接受的答案中沒有速度比較的方法。 – Danny

回答

1

最快的方法可能會分別執行這兩個調用,並將它們存儲爲使用向量化函數來執行任何操作。

tmpNames <- names(lst) 
tmpValues <- as.vector(unlist(lst)) 

例如,

paste0(tmpNames, tmpValues) 

比您當前的實施快大約2-3倍。

+0

謝謝,我沒有想過單獨存儲它們。我想使用的函數不是矢量化的,所以我仍然需要一個循環/應用程序,但我認爲這仍然是更快的實現? – Danny

+0

很難說不知道你想做什麼。您可以更新您的原始帖子並提供完整的詳細信息,也可以發佈關於您的循環是否可以被矢量化的單獨問題我還沒有看到許多操作無法在某些方面被矢量化。 – Gladwell