2012-09-09 13 views
6

मैं निम्नलिखित नेस्टेड पाश हैदोहराएं

for (x in xs) { 
    for (y in ys) { 
     # Do something with x and y 
    } 
} 

कौन सा मैं समतल करना चाहते हैं तो मैं दो वैक्टर xs और ys की कार्तीय उत्पाद के निर्माण और परिणाम पर पुनरावृत्ति के बारे में सोचा । अजगर में, इस तुच्छ होगा:

for xy in product(xs, ys): 
    # x, y = xy[0], xy[1] 

लेकिन आर में, सबसे सरल बराबर मैंने पाया चुनौतीपूर्ण लग रहा है:

xys <- expand.grid(xs, ys) 
for (i in 1 : nrow(xys)) { 
    xy <- as.vector(xys[i, ]) 
    # x <- xy[1], y <- xy[2] 
} 

निश्चित रूप से वहाँ एक बेहतर तरीका है, नहीं होना चाहिए? (स्पष्ट करने के लिए, मैं ... मुझे लगता है कि एक तरह से सीधे उत्पाद में tuples की पुनरावृत्ति करने के लिए वहाँ होना चाहिए एक सूचकांक से अधिक पुनरावृति करने के लिए नहीं करना चाहती।)

उत्तर

8

आप अपने डेटा फ्रेम की प्रत्येक पंक्ति में फ़ंक्शन लागू करने के लिए apply फ़ंक्शन का उपयोग कर सकते हैं। अपने वास्तविक फ़ंक्शन के साथ बस "your function" को प्रतिस्थापित करें।

# example data 
xs <- rnorm(10) 
ys <- rnorm(10)  

apply(expand.grid(xs, ys), 1, FUN = function(x) {"your function"}) 

यह एक बहुत ही बुनियादी उदाहरण है। इधर, एक पंक्ति में दोनों मानों का योग गणना की जाती है:

myfun <- function(xs, ys) xs + ys 
arguments <- expand.grid(xs = rnorm(10), ys = rnorm(10)) 
apply(arguments, 1, function(x)do.call(myfun, as.list(x))) 
:

apply(expand.grid(xs, ys), 1, FUN = function(x) {x[1] + x[2]}) 

यहाँ एक प्रकार नामित तर्कों (xs, ys) का उपयोग करता है सूचकांकों की बजाय (x[1], x[2]) है

+0

@ कोनराड रुडॉल्फ: मैंने अपना जवाब हटा दिया। इसके साथ कुछ भी गलत नहीं था। मुझे यकीन नहीं था कि यह वास्तव में वह समाधान था जिसे आपने देखा था। @flodel मिश्रित इनपुट प्रकारों के साथ 'लागू' का उपयोग कर समस्याओं के बारे में सही है। इस मामले में, आप एक स्ट्रिंग को संख्यात्मक मान में बदलने के लिए 'as.numeric' का उपयोग कर सकते हैं। लेकिन जब तक आप केवल संख्यात्मक वैक्टर का उपयोग नहीं करते हैं तब तक कोई समस्या नहीं है। –

10

आर अजगर से एक अलग प्रतिमान है, तो डॉन ' टी जनरेटर या tuples होने की उम्मीद नहीं है - हमारे पास वैक्टर और सूचकांक हैं।

इस तरह, एक कार्तीय उत्पाद पर एक समारोह मैप करने के लिए बस

outer(xs,ys,function(x,y) ...) 

फोन और परिणाम undim यदि आप चाहें तो।

संपादित करें: मामले में xs या ys आधार वैक्टर तुलना में अधिक जटिल कुछ कर रहे हैं, एक ही विकल्प सूचकांकों का उपयोग करने, यानी

outer(seq(a=xs),seq(a=ys),function(xi,yi) ... xs[[xi]]/ys[xi,]/etc. ...) 

या का उपयोग करते हुए एक सा हाथ से तैयार उत्पाद पर एक समारोह के नक्शे है mapply

mapply(function(x,y) ...,xs,rep(ys,each=length(xs))) 
+0

मैं विभिन्न प्रतिमानों से चिंतित नहीं हूं। मैं * अपने कोड में इंडेक्स चर के व्यापकता के बारे में चिंतित हूं। जहां तक ​​मैं आर को समझता हूं, उनमें से अधिकांश/अनावश्यक होना चाहिए। आपका उदाहरण कोड * दिखता है * जैसा मैंने खोजा है, गलत तरीके से व्यवहार करता है: 'बाहरी (1: 2, 3: 4, फ़ंक्शन (x, y) {प्रिंट (sprintf ('% d,% d ', एक्स, वाई))} '- यह एक सरणी * और * परिणामों के साथ एक मैट्रिक्स प्रिंट करता है - इसलिए मुझे नहीं पता कि मेरे लूप को यहां काम करने के लिए कैसे लिखना है ... (मुझे नहीं पता कि आपका मतलब" अनावश्यक "है, शायद यह समझाएगा।) –

+0

उह, पिछली टिप्पणी बेवकूफ है। मैट्रिक्स सिर्फ 'बाहरी' का वापसी मूल्य है। फिर भी, मुझे अभी भी यकीन नहीं है कि यह मेरे नेस्टेड लूप के प्रतिस्थापन के रूप में काम करने के लिए कैसे अनुकूलित किया जाए, चूंकि 'x' और' y' वैक्टर हैं, स्केलर्स नहीं। दुर्भाग्यवश, मुझे वास्तव में स्केलर की आवश्यकता है। –

+0

@ कोनराड्रूडॉल्फ ओके, विस्तारित। – mbq