2015-01-17 5 views
6

मेरे पास आर में डेटाटेबल है जिसमें कई आईडी और एक मान है। आईडी के प्रत्येक संयोजन के लिए, कई पंक्तियां हैं। यदि इनमें से किसी पंक्ति में कॉलम 'मान' में NA शामिल है, तो मैं आईडी के इस संयोजन के साथ सभी पंक्तियों को हटाना चाहता हूं। उदाहरण के लिए, नीचे दी गई तालिका में, मैं उन सभी पंक्तियों को हटाना चाहूंगा जिनके लिए id1 == 2 और id2 == 1कई स्तंभों के मानों के आधार पर आर में डेटा.table से पंक्तियां निकालें

यदि मेरे पास केवल एक आईडी थी तो मैं dat[!(id1 %in% dat[is.na(value),id1])] करूँगा। उदाहरण में, यह उन सभी पंक्तियों को हटा देगा जहां i1 == 2. हालांकि, मैंने कई कॉलम शामिल करने का प्रबंधन नहीं किया था।

dat <- data.table(id1 = c(1,1,2,2,2,2), 
        id2 = c(1,2,1,2,3,1), 
        value = c(5,3,NA,6,7,3)) 
+1

कोशिश 'Dat [! (ID1 == 2 और आईडी 2 == 1)]' या 'setkey (डीएटी, ID1 आईडी 2) [! जम्मू (2, 1)] ' – akrun

+0

मुझे पता है कि यह उपरोक्त सरल उदाहरण में काम करेगा। हालांकि, सवाल अधिक सामान्य होने के लिए है क्योंकि एनएएस के साथ बड़ी संख्या में पंक्तियां हो सकती हैं। – lilaf

+1

मुझे लगता है कि वह 'डेटा [, अगर (सभी (! Is.na (मान)) की तलाश में है।) एसडी,। (आईडी 1, आईडी 2)]' –

उत्तर

4

आप अगर कोई भी मान NA रों हैं id1 और id2 के संयोजन प्रति जाँच करने के लिए और फिर उस पूरे संयोजन को दूर चाहते हैं, आप समूह में एक if बयान सम्मिलित कर सकते हैं और केवल परिणामों (.SD उपयोग करते हुए) को पुनः प्राप्त अगर वह कथन TRUE देता है।

dat[, if(!anyNA(value)) .SD, by = .(id1, id2)] 
# id1 id2 value 
# 1: 1 1  5 
# 2: 1 2  3 
# 3: 2 2  6 
# 4: 2 3  7 

या इसी तरह,

dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)] 
+1

फिर से धन्यवाद! – lilaf

+0

उन सभी 'एसडी' में 'डेटा' को विभाजित करना महंगा हो सकता है और उन्हें ढेर कर सकता है। एक विकल्प (शायद आम तौर पर तेज़?) दृष्टिकोण 'डेटा [डेटा!, किसी भी (is.na (मान)) को रखने के लिए पंक्तियों का चयन करना होगा, = "id1, id2"] $ V1] ' – Frank

+1

@ फ्रैंक, काम नहीं करेगा क्या आपने इसका परीक्षण किया? –

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