आर

2009-10-25 13 views
5

मैं R's stats पैकेज का उपयोग कर रहा हूँ और, all the rows of a dataframe में column[x] लूप करने के लिए चाहते हैं एक समारोह के साथ कॉलम में each cell में डेटा पर काम करते हैं और एक नया स्तंभ (calculated result में साथ करने के लिए परिणाम पारित में एक स्तंभ के माध्यम से लूपिंग new columncolumn[x] में डेटा)आर

मैं दो समस्याओं मिल गया है के साथ गठबंधन:

  1. मैं इसे
  2. पाशन काम करने के लिए नहीं मिल सकता हैमें हतोत्साहित किया जा रहा हैमैंने पढ़ा है। क्या कोई वैकल्पिक दृष्टिकोण है और यदि नहीं, तो क्या किसी के पास लूप को कैसे लेना है इसका एक उदाहरण है?
+0

क्या आप हमें कुछ और विवरण दे सकते हैं? उदाहरण की समस्या की तरह आप काम कर रहे हैं? – ariddell

+2

लूपिंग जरूरी नहीं है। इसे पहले काम करें, और केवल तभी तेजी से प्राप्त करने के बारे में सोचें। –

उत्तर

8

किसी भी उदाहरण के बिना, जवाब देना कितना मुश्किल है। तुम क्या वर्णन कर रहे हैं के बुनियादी मामला है, तथापि, यह है:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

जब आप एक वेक्टर वर्ग (या सदिश की तरह संरचना, जैसे Dat $ एक्स) आर कहता हूं, इसे अलग से प्रत्येक मान वर्ग जानता है । आपको ज्यादातर मूल्यों पर स्पष्ट रूप से लूप की आवश्यकता नहीं है - हालांकि, डिर्क नोट्स के रूप में, आपको केवल अपनी लूप को अनुकूलित करने के बारे में चिंता करनी चाहिए यदि वे आपको समस्याएं पैदा कर रहे हैं। जिसके अनुसार, मैं निश्चित रूप से पढ़ने और लिखने के

dat$y <- dat$x^2 

करना पसंद करते हैं: जहां संभव

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

...।

+0

धन्यवाद। मैं अंकगणित काम ठीक कर सकते हैं। मैं एक फ़्रेम में डेटाफ्रेम की सामग्री को पास करने में सक्षम नहीं हूं। यहाँ समस्या है। यहाँ फ्रेम (बुलाया डेटा) शीर्षकों "यौगिक" के साथ और करने के लिए "मुस्कान" (मुस्कान एक अणु का एक पाठ प्रतिनिधित्व कर रहे हैं) Compound_ID मुस्कान 12345 c1cccccc1 मैं समारोह parse.smiles उपयोग करना चाहते हैं() के शीर्ष है मुस्कान में पढ़ो और एक अणु उत्पादन। अगर मैं इसे एक अणु पर करता हूं तो ठीक है (जंक <- "c1ccccc1", पार्स।मुस्कान (जंक) अगर मैं एसपी <करते हैं - get.smiles.parser() कबाड़ <- sapply (डेटा $ मुस्कान, parse.smiles, पार्सर = एसपी) यह मुस्कान – Andy

+0

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

1

अगर parse.smiles() एक समारोह आप एक वेक्टर के सभी प्रवेश "vec" पर लागू करना चाहते है, तो आप उपयोग कर सकते हैं:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

सभी को धन्यवाद। जिस स्तंभ में मुझे रूचि थी वह एक कारक के रूप में पढ़ा गया था। मुझे स्पष्ट रूप से सामग्री में अक्षरों के रूप में पढ़ने के लिए फ़ंक्शन को स्पष्ट रूप से बताना था और मुझे इसकी ओर इशारा नहीं हुआ था। यह अब काम कर रहा है। (और उपरोक्त गड़बड़ टिप्पणी के लिए माफ़ी - यह पोस्ट के दौरान गायब होने वाले रिटर्न के साथ स्वरूपित किया गया था) – Andy

1

एकमात्र कारण पाशन हतोत्साहित किया जाता है यह है कि है धीमी गति से। आर एक समय में वैक्टर पर काम करने के लिए डिज़ाइन किया गया है और इसे पूरा करने के लिए बहुत सारे कार्य हैं। पूरे परिवार को लागू करने के साथ-साथ वेक्टरिज़ जैसे कार्यों को भी मदद करने के लिए लागू होते हैं। तो मुहावरे यह है कि यदि आप लूप के लिए उपयोग करते हैं तो आप आर में नहीं सोच रहे हैं, लेकिन कभी-कभी लूप के लिए वास्तव में उचित होते हैं।

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

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

परिवार (लागू होते हैं, sapply, lapply, mapply, tapply) भी विकल्प हैं लागू होते हैं। अधिकांश देशी आर फ़ंक्शंस पहले से ही वेक्टरकृत होते हैं, लेकिन अतिरिक्त तर्कों को पार करते समय सावधान रहें जिन्हें वेक्टर के रूप में समझा जाना चाहिए।