आर

2013-02-08 8 views
5

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

refs <- levels(data$ref) 

result <- c() 
for (ref in refs) { 
    # Find the minimum distance for observations with the current ref 
    # but be sure to protect against ref == target! 
    best_dist <- min(data[data$ref == ref & data$target != ref,]$distance) 
    result <- c(result, best_dist) 
} 

Am मैं अपने डेटा फ्रेम इस तरह की स्थापना की या इस vectorize करने के लिए एक अच्छा तरीका है होने से बर्बाद:

यहाँ मेरी कोड है? सहायता के लिए धन्यवाद!

उत्तर

6

c, cbind, rbind का उपयोग करके किसी लूप के भीतर कभी भी ऑब्जेक्ट न बढ़ाएं। वस्तु हर बार कॉपी की जाएगी। इसके बजाए सही आकार के लिए आवंटित करें (या परिणाम तरल पदार्थ होने पर कुछ अतिसंवेदनशील)।

कहा जा रहा है, एक पाश यहाँ

की आवश्यकता नहीं है मैं स्मृति क्षमता और कोडिंग भव्यता के लिए data.table रों पसंद है।

library(data.table) 
DT <- data.table(data) 


DT[ref != target, list(bestdist = min(distance)), by = ref] 

यदि रेफरी और लक्ष्य विभिन्न स्तरों (टिप्पणी में सुझाव के रूप में) के साथ कारक स्तंभ हैं, तो या तो उन्हें समान स्तर है, या चरित्र

DT[as.character(ref) != as.character(target), list(bestdist = min(distance)), by = ref] 
+0

में बदलने मुझे लगता है कि आप कर एक ')' गायब है ... – adibender

+0

टा। अब फिक्स्ड .. – mnel

+0

ऐसा लगता है कि यह बिल्कुल सही काम नहीं करता है। मुझे यह कोशिश करते समय निम्न त्रुटि मिलती है: ** ओपीएस.फैक्टर (रेफरी, लक्ष्य) में त्रुटि: कारकों के स्तर सेट अलग हैं ** हालांकि, ** डीटी [, सूची (bestdist = min (distance)), द्वारा = रेफरी] ** आउटपुट उत्पादन करता है, लेकिन रेफरी के बिना! = लक्ष्य जांच। – weitzner