2011-01-28 14 views
5

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

 [,1] [,2] [,3] [,4] 
[1,] NA 1 NA 1 
[2,] 1 NA NA 2 
[3,] NA 2 NA 3 

सत्य वापस आने वाले इंडेक्स का एकमात्र मान [2,2] होना चाहिए।

क्या मैं क्या करना चाहता हूं इसके लिए एक कॉम्पैक्ट अभिव्यक्ति है? अगर मुझे कॉलम के माध्यम से लूप करना पड़ता था और प्रत्येक कॉलम में पहला गैर-एनए मान खोजने के लिए min(which(!is.na(x[,i]))) जैसे कुछ का उपयोग करना था, और फिर उसके पहले सभी मानों को FALSE (और अधिकतम के बाद सभी मानों के लिए) सेट करना था। इस तरह से मैं अग्रणी और पिछली एनए मानों का चयन नहीं करूंगा। लेकिन यह थोड़ा गन्दा लगता है, इसलिए मैं सोच रहा हूं कि एक क्लीनर अभिव्यक्ति है जो बिना लूप के करता है।

EDIT मान्य होने के लिए एनए मान को केवल कॉलम के भीतर कहीं और उसके बाद एक गैर-एनए मान होना चाहिए, लेकिन इसके लिए जरूरी नहीं है। उदाहरण के लिए, यदि कॉलम (एनए, 3, एनए, एनए, एनए, 4, एनए) द्वारा एक कॉलम परिभाषित किया गया था, तो एनए जो मैं खोजना चाहता हूं वह पद 3, 4, और 5 पर होगा, क्योंकि ये इनके द्वारा संलग्न हैं गैर-एनए मान

+0

[2,3] भी वापस नहीं किया जाना चाहिए? – daroczig

+0

daroczig - नहीं, क्योंकि कॉलम में पहले और उसके बाद कोई गैर-एनए मान नहीं है। – Abiel

+0

धन्यवाद, मुझे आपके प्रश्न को और अधिक विचारपूर्वक पढ़ना चाहिए था। मैंने आपके विवरण के आधार पर एक वेक्टरकृत उत्तर बनाने की कोशिश की, मुझे उम्मीद है कि यह आपके लिए काम कर सकता है। – daroczig

उत्तर

4

बहुत अच्छी तरह से इस परीक्षण नहीं किया है, लेकिन यह परीक्षण मामले पर काम करता है:

z <- matrix(c(NA,1,NA,1,NA,2,NA,NA,NA,1,2,3),ncol=4) 
isNA <- is.na(z) 
# Vertical index which increments at non-NA entries, counting top-to-bottom: 
nonNA_idx.tb <- apply(!isNA, 2, cumsum) 
# Vertical index which increments at non-NA entries, counting bottom-to-top: 
nonNA_idx.bt <- apply(!isNA, 2, function(x) { rev(cumsum(rev(x))) }) 
which(isNA & nonNA_idx.tb>0 & nonNA_idx.bt>0, arr.ind=TRUE) 

(पुनश्च - मुझे लगता है कि यह बहुत प्यारा है, लेकिन मैं पक्षपाती हूँ)

+0

धन्यवाद बेन, मेरे शुरुआती परीक्षण इस काम को दिखा रहे हैं। – Abiel

+0

आपको चतुरता की व्याख्या करने की आवश्यकता है। x1 एक अनुक्रमिक अनुक्रम है जो गैर-एनए प्रविष्टियों में वृद्धि करता है, जो ऊपर-नीचे की गणना करता है। x2 वही है, पिछड़ा गिनती (नीचे से ऊपर)। वे दोनों शीर्ष और निचले स्तर पर गैर-एनएएस द्वारा संलग्न आंतरिक प्रविष्टियों में केवल गैर-शून्य हैं, इसलिए दोनों दिशाओं में उनकी गैर-एनए इंडेक्स गिनती हैं> 0। आखिरकार गेट जो आंतरिक एनएएस को फ़िल्टर करने के लिए और फ़िल्टर करता है। क्या आप x1, x2 का नाम अधिक सहज हो सकते हैं? nonNA_idx.tb, nonNA_idx.bt शायद? – smci

+0

@ एसएमसीआई, यदि आपके पास आवश्यक प्रतिष्ठा है (और ऐसा लगता है कि आप करते हैं - 2 के), तो संपादित करने के लिए स्वतंत्र महसूस करें ... –

1
m <- matrix(c(NA, 1, NA, 1, NA, 2, NA, NA, NA, 1, 2, 3), ncol= 4) 

matmain <- is.na(m) 
matprev <- rbind(FALSE, head(!matmain, -1)) 
matnext <- rbind(tail(!matmain, -1), FALSE) 

which(matmain & (matprev | matnext), arr.ind = TRUE) 

मैंने प्रश्न को थोड़ा अलग तरीके से व्याख्या की। जब आप कॉलम में पहले और बाद में कहते हैं, तो क्या आपका मतलब पहले और बाद में, या पहले और बाद में कहीं भी है? निम्नलिखित परीक्षण मैट्रिक्स के साथ, हमारे पास [2,1] [3,1] और [2,2] है, लेकिन [2,3] के बारे में क्या है?

m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4) 
+0

आपका उत्तर और मेरा पूरक है, मुझे लगता है (प्रश्न की विभिन्न व्याख्याएं) –

+0

वास्तव में करीब पढ़ने पर, मुझे लगता है कि मुझे यह गलत लगता है, क्योंकि मेरा संस्करण और अधिक लौटाता है [2, 2] से। '&' को अंतिम पंक्ति में '&' में बदलें और यह केवल [2, 2] देता है, लेकिन मुझे लगता है कि वह संचयी NA गणना की तलाश में है। हालांकि, एक उपयोगी सवाल है क्योंकि मैंने लूप के उपयोग किए बिना आस-पास की पंक्तियों और कॉलमों को संदर्भित करने से पहले कभी नहीं समझ लिया था। –

+0

भ्रम के लिए खेद है, मेरा मतलब था एनए जिसके लिए कॉलम में पहले या बाद में गैर-एनए मूल्य कुछ है, लेकिन इसके लिए जरूरी नहीं है। उदाहरण के लिए, यदि आपके पास इनपुट मैट्रिक्स मैट्रिक्स (सी (एनए, 1, एनए, एनए, 1, एनए, एनए, 2, एनए, एनए, एनए, एनए, 1,2,3,4), एनकॉल = 4) था, आप केवल [2,2] और [2,3] वापस करना चाहते हैं। फिर भी, आपका कोड निश्चित रूप से एनएएस से निपटने की संबंधित समस्या के लिए एक दिलचस्प दृष्टिकोण प्रदान करता है जिसके लिए आसन्न गैर-एनए मूल्य होना चाहिए। – Abiel

0

अंक < - नमूना (ग (1: 10, एनए), आकार = 100, की जगह = टी)

चटाई < - मैट्रिक्स (अंक, ncol = 10)

जो (is.na (mat), arr.ind = टी)

संबंधित मुद्दे