2011-10-18 84 views
9

Tôi có một khung dữ liệu gồm hai cột: khóa và giá trị và tôi muốn tạo một từ điển bằng cách sử dụng hàng tương ứng của mỗi cột cho mỗi phần tử của từ điển/bảng băm.Làm cách nào để tạo bảng từ điển/bảng băm bằng cách lặp qua một cột?

Theo tôi hiểu cách điển hình của việc sử dụng từ điển R/bảng băm là bằng cách làm một cái gì đó tương tự như thế này.

labels.dic <- c("Id of the item and some other description" = "id") 

này hoạt động hoàn toàn tốt đẹp nhưng khi tôi cố gắng để làm điều đó bằng cách sử dụng các giá trị từ các khung dữ liệu (tên lbls trong ví dụ) nó không hoạt động. Lý do tại sao điều này xảy ra?

labels.dic <- c(lbls[1,1]=lbls[1,2]) 
Error: unexpected '=' in "c(lbls[1,1] =" 
+0

R không làm từ điển, bạn đang cố gắng sử dụng một ngôn ngữ mà nó không được thiết kế để được sử dụng như một thợ mộc nhìn thấy cố gắng sử dụng một tuốc nơ vít để đào một lỗ trên mặt đất. Chắc chắn bạn có thể mâu thuẫn với bản thân và làm việc thật sự chăm chỉ để làm điều gì đó tương tự, nhưng mọi người sẽ chỉ nhìn bạn buồn cười. R không được thiết kế cho các loại thao tác dữ liệu lặp lại như vậy. –

Trả lời

8

Dường như với tôi bạn đã nhận được một số thông tin sai lạc. Tôi thậm chí không chắc chắn nơi bạn có ý tưởng về cú pháp đó để tạo ra một hashtable.

Trong mọi trường hợp: đối với chức năng giống như hashtable, bạn có thể muốn xem xét sử dụng environment: các công việc này trong nội bộ với một hashtable (nếu tôi nhớ chính xác), do đó, làm khá những gì bạn muốn.

Bạn sẽ sử dụng một cái gì đó này như:

someenv<-new.env() 
someenv[["key"]]<-value 

Với data.frame của bạn, một cái gì đó như thế này sẽ lấp đầy nó lên:

for(i in seq(nrow(lbls))) 
{ 
    someenv[[ lbls[i,1] ]]<- lbls[i,2] 
} 

(lưu ý: điều này đòi hỏi rằng cột đầu tiên là một nhân vật thực tế cột, không phải là một yếu tố !!)

Sau đó, bạn có thể dễ dàng nhận được giá trị được đặt tên bằng cách sử dụng someenv[["nameofinterest"]].

+0

Nick [ở đây] (http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html) là nơi tôi thấy ký hiệu này. Tôi đã điền thành công từ điển/bảng băm với từ điển ký hiệu [[key]] <- value. Tuy nhiên tôi không biết tại sao điều này làm việc một cách và không phải là khác. Cảm ơn bạn đã giúp đỡ. – pedrosaurio

+0

OK, tôi hiểu ý của bạn là gì. Tôi đã được đưa ra bởi bạn chỉ sử dụng 1 cặp khóa/giá trị trong ví dụ của bạn. Tuy nhiên: môi trường được cho là có hiệu suất tốt hơn ở loại điều này. Nếu hiệu suất không phải là một vấn đề, một vector được đặt tên (như @kohske được đề xuất) hoặc danh sách sẽ hoạt động tốt. –

+1

@pedrosaurio - Vâng, môi trường ĐANG magnitudes nhanh hơn này khi bạn có một số 1000 mục. 'new.env (hash = TRUE)' là cần thiết trong R 2.12 và trước đó (chúng thay đổi thành hash = TRUE trong 2.13). – Tommy

3

Cách dễ nhất là thay đổi names sau khi tạo biến. Vì vậy, bạn có thể xác định một chức năng như sau:

cc <- function(name, value) { 
    ret <- c(value) 
    names(ret) <- name 
    ret 
} 

cc(c(letters[1:2], "a name"), c(LETTERS[1:2], "a value")) 

# output like this 
# a   b a name 
# "A"  "B" "a value" 
+1

cc của bạn đã tồn tại - nó được gọi là setNames. – hadley

+1

OK. Tôi nghĩ rằng rất khó để tìm thấy, mặc dù ... – kohske

+2

Đó là lý do tại sao bạn nên đọc 'help (package = base)' và 'help (package = stats)';) – hadley

3

Một tùy chọn khác tương tự như những gì bạn đã thấy với Python hoặc Perl là gói hash. Xem: http://cran.r-project.org/web/packages/hash/

Nếu khóa của bạn đặc biệt dài thì tôi khuyên bạn nên lưu trữ hai bảng băm. Đầu tiên, băm khóa, sử dụng gói digest và lưu trữ từ điển (bảng băm) ánh xạ từ khóa đến khóa (ánh xạ từ khóa đến tiêu hóa đã được thực hiện bởi gói digest ;-)), và sau đó từ thông báo đến giá trị mà bạn muốn lưu trữ. Điều này làm việc rất tốt cho tôi.

Các vấn đề liên quan