2013-02-04 54 views
3

我正在處理地圖數據結構,我需要存儲關鍵值對。如何在R中使用地圖?

map[key1]<-value1 
map[key2]<-value2 
map[key3]<-value3 
map[key4]<-value4 

我需要獲得基於密鑰的價值。我如何在R中實現這個?

回答

9

使用列表,因爲c構建一個簡單的載體不能處理更多的事情比標量值:

> map = c(key1 = c(1,2,3), key2 = 2, key3 = 3) 
> map[["key1"]] 
Error in map[["key1"]] : subscript out of bounds 

爲什麼這會失敗?因爲map現在是:

> map 
key11 key12 key13 key2 key3 
    1  2  3  2  3 

使用list代替:

> map = list(key1 = c(1,2,3), key2 = 2, key3 = 3) 
> map[["key1"]] 
[1] 1 2 3 

也可動態擴展:

> map[["key99"]]="Hello You!" 
> map 
$key1 
[1] 1 2 3 

$key2 
[1] 2 

$key3 
[1] 3 

$key99 
[1] "Hello You!" 

開始與空map=list()如果你正在建設一個。

+0

如果地圖將會很大並且速度是一個問題,那麼使用環境而不是列表可能會有所幫助。爲了更快的查找,散列環境被散列,我認爲列表將被線性搜索直到找到匹配的鍵。對於小型案例(和其他案例),您不會注意到時間上的差異,因此列表很好,但如果大小和速度很重要,那麼環境可以提供幫助。 –

+0

你如何得到名單(鍵)的名單? 'map.names'不起作用。 – Rhubarb

+0

'name(map)' - 這是R,不是python。 – Spacedman

1

您可以使用一個名爲向量:

map = c(key1 = 1, key2 = 2, key3 = 3) 
map[["key1"]] 

你可以輕鬆地添加新的:

map[["key4"]] = 4 
> map 
key1 key2 key3 key4 
    1 2 3 4 
+1

我需要動態地做到這一點。我正在解析一個文件,所以我無法使用固定大小的map = c(key1 = 1,key2 = 2,key3 = 3) – Manish

+1

您可以動態添加內容,查看我的編輯。如果你想使用非常大的地圖結構,你可以選擇預先分配它。而我的意思是數千甚至更多。 –

+3

這隻有在值爲原子時纔有效。除此以外,請使用列表。 – Spacedman