2011-10-18 13 views
9

मेरे पास दो कॉलम का डेटा फ्रेम है: कुंजी और मान और मैं शब्दकोश/हैश तालिका के प्रत्येक तत्व के लिए प्रत्येक कॉलम की संबंधित पंक्ति का उपयोग करके एक शब्दकोश बनाना चाहता हूं।कॉलम के माध्यम से पुनरावृत्ति करके शब्दकोश/हैश तालिका कैसे बनाएं?

जहां तक ​​मैं आर शब्दकोश/हैश तालिकाओं का उपयोग करने के सामान्य तरीके को समझता हूं, इस तरह कुछ ऐसा कर रहा है।

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

यह पूरी तरह से ठीक काम करता है लेकिन जब मैं डेटा फ्रेम मानों का उपयोग करके यह करने की कोशिश (उदाहरण में lbls नाम) यह काम नहीं करता। ऐसा क्यों होता है?

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

आर शब्दकोश नहीं करता है, आप ऐसी भाषा का उपयोग करने की कोशिश कर रहे हैं जहां इसे एक सुई की तरह इस्तेमाल करने के लिए डिज़ाइन नहीं किया गया है जो जमीन में एक छेद खोदने के लिए एक स्क्रूड्राइवर का उपयोग करने की कोशिश कर रहा है। निश्चित रूप से आप खुद को अलग कर सकते हैं और कुछ ऐसा करने के लिए वास्तव में कड़ी मेहनत कर सकते हैं, लेकिन लोग सिर्फ आपको मजाकिया दिखने जा रहे हैं। आर इस प्रकार के पुनरावृत्त डेटा हेरफेर के लिए डिज़ाइन नहीं किया गया है। –

उत्तर

8

ऐसा प्रतीत होता है कि आपको कुछ गलत जानकारी मिली है। मैं यह भी निश्चित नहीं हूं कि आपको हैशटेबल बनाने के लिए उस वाक्यविन्यास का विचार मिलता है।

किसी भी मामले में: हैशटेबल जैसी कार्यक्षमता के लिए, आप environment का उपयोग करने पर विचार करना चाह सकते हैं: इन कार्यों को आंतरिक रूप से हैशटेबल (यदि मुझे सही याद है) के साथ काम करना है, तो आप जो भी करना चाहते हैं, वही करें।

आप की तरह यह कुछ का प्रयोग करेंगे: अपने data.frame को देखते हुए

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

, कुछ इस तरह यह भरने जाएगा:

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

(ध्यान दें: यह जरूरी है कि पहले कॉलम एक वास्तविक चरित्र है कॉलम, एक कारक नहीं !!)

आप someenv[["nameofinterest"]] का उपयोग कर आसानी से नामित मूल्य प्राप्त कर सकते हैं।

+0

निक [यहां] (http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html) वह जगह है जहां मैंने यह नोटेशन देखा था। मैंने नोटेशन शब्दकोश [[key]] <- value के साथ सफलतापूर्वक अपना शब्दकोश/हैश तालिका भर दी है। फिर भी मुझे नहीं पता कि यह एक तरह से क्यों काम करता है, न कि दूसरे। आपकी सहायता के लिए धन्यवाद. – pedrosaurio

+0

ठीक है, मैं देखता हूं कि आपका क्या मतलब है। मुझे आपके उदाहरण में केवल 1 कुंजी/मूल्य जोड़ी का उपयोग करके आप को हटा दिया गया था। फिर भी: वातावरण इस तरह की चीज पर बेहतर प्रदर्शन होना चाहिए। यदि प्रदर्शन कोई मुद्दा नहीं है, तो नामित वेक्टर (जैसे @ कोहस्के सुझाए गए) या एक सूची ठीक ठीक करेगी। –

+1

@pedrosaurio - हाँ, वातावरण इस पर तेजी से बढ़ते हैं जब आपके पास कई 1000 प्रविष्टियां होती हैं। '2.1. और पहले) में new.env (हैश = TRUE) की आवश्यकता है (वे 2.13 में हैश = TRUE में बदल गए हैं)। – Tommy

3

चर बनाने के बाद names को बदलने का सबसे आसान तरीका है। तो आप इस तरह के एक समारोह को परिभाषित कर सकते हैं:

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

आपका सीसी पहले से मौजूद है - इसे सेटनाम कहा जाता है। – hadley

+1

समझ गया। मुझे लगता है कि यह खोजना मुश्किल है, हालांकि ... – kohske

+2

यही कारण है कि आपको 'सहायता (पैकेज = आधार)' और 'सहायता (पैकेज = आंकड़े)' पढ़ना चाहिए;) – hadley

3

एक अन्य विकल्प जो आपने पाइथन या पर्ल के साथ देखा है, hash पैकेज है। देखें: http://cran.r-project.org/web/packages/hash/

यदि आपकी चाबियाँ विशेष रूप से लंबी हैं, तो मैं दो हैश तालिकाओं को संग्रहित करने की अनुशंसा करता हूं। सबसे पहले, digest पैकेज का उपयोग करके कुंजी को हैश करें और एक शब्दकोश (हैश टेबल) संग्रहीत करें जो पाचन से कुंजी तक मैप करता है (कुंजी से पचाने के लिए मैपिंग पहले से ही digest पैकेज ;-)) द्वारा किया जाता है, और फिर पाचन से मूल्य तक कि आप स्टोर करना चाहते हैं। यह मेरे लिए बहुत अच्छा काम करता है।