2014-07-06 64 views
1

依託the thread here鍵/值,我製備如下R「字典」:返回使用R「字典」

boxes_sent <- vector(mode="list", length=4) 
boxes_sent <- c("NE01", "NE02", "NE03", "NE04") 
names(boxes_sent) <- c(seq(1:4)) 

boxes_rcvd <- vector(mode="list", length=4) 
boxes_rcvd <- c("NW01", "NW02", "NW03", "NW04") 
names(boxes_rcvd) <- c(seq(from = 13, to =16)) 

boxes_all <- c(boxes_rcvd, boxes_sent) 

> boxes_all 
13  14  15  16  1  2  3  4 
"NW01" "NW02" "NW03" "NW04" "NE01" "NE02" "NE03" "NE04" 

調用names(boxes_all)[[1]]返回「13」,而boxes_all[[1]]返回「NW01」這兩者的對應列表中的第一項。但是,我認爲這將基於我在執行names(boxes_sent) <- c(seq(1:4))時建立的鍵/值對返回「NE01」。我該如何修改,以致致電names(boxes_all)[[1]]返回「NE02」?在我的數據集中,我有39個鍵/值對的字典。

我想用names()要做到這一點,雖然我試圖環境中the thread here建議沒有成功:

boxes_sent<-new.env() 
boxes_sent[["NE01", "NE02", "NE03", "NE04"]]<-c(seq(1:4)) 
boxes_rcvd <- new.env() 
boxes_rcvd[["NW01", "NW02", "NW03", "NW04"]]<-c(seq(from = 13, to =16)) 

Error in boxes_sent[[c("NE01", "NE02", "NE03", "NE04")]] <- c(seq(1:4)) : 
    wrong args for environment subassignment 

感謝您的時間和精力。

[R版本3.0.3

+0

你試過'訂購'或'排序'?也許,我誤解了這個問題。 boxes_all1 < - boxes_all [order(as.numeric(names(boxes_all)))] boxes_all1 [1] 「NE01」 – akrun

回答

1

第一件事:你不需要R.指定變量類型,因此,當你有這樣的代碼:

boxes_sent <- vector(mode="list", length=4) 
boxes_sent <- c("NE01", "NE02", "NE03", "NE04") 

您正在定義boxes_sent爲然後將其重新定義爲字符向量。所以第一條線是浪費時間。

其次,c(seq(1:4))是三重矯枉過正。 1:4爲您提供從一到四的數字序列,返回一個整數向量。這與撥打seq(1, 4)c(1, 2, 3, 4)相同。你不需要這三個人。

第三,當您爲矢量指定名稱時,請注意這些名稱存儲爲字符矢量。 (這正是你想要的字典的行爲。)請注意,

names(boxes_sent) 
## [1] "1" "2" "3" "4" 

第四,如果你想使用一個向量作爲一本字典,那麼你正在使用的那種索引錯誤。字典的全部要點是你傳遞一個字符串作爲索引('鍵'),你會得到一個值。因此,在這種情況下,您的密鑰是字符串「1」,「2」,「3」,「4」,「13」,「14」,「15」,「16」。因此,要檢索值「NE02」,您需要傳入密鑰「2」。那就是,輸入boxes_all["2"]

第五,搞亂環境是一個高級話題。你幾乎不需要明確地使用它們。對於字典行爲,如果所有值都是字符串,則使用字符向量。如果這些值具有不同的尺寸或類型,則使用列表。

+0

這是非常寶貴的!在我的大型數據集中,我使用循環和'toString()'遍歷數據框,將每個索引轉換爲字符串並返回正確的值。 – sedeh

+0

如果有人能指出如何使用環境實現這一目標,那將是一個額外的學習。謝謝。 – sedeh