2012-04-02 21 views
19

मुझे आर में शून्य मूल्य के साथ पंक्तियों को हटाने का तरीका हल करने में समस्या है। अन्य हाथों में, मैं एनए मूल्यों को हटाने के लिए 0 NAका उपयोग करने के लिए na.omit() का उपयोग कर सकता हूं।आर में शून्य मूल्य के साथ पंक्तियों को कैसे निकालें?

क्या कोई जानता है कि आर में शून्य मूल्यों के साथ पंक्तियों को कैसे हटाया जाए?

उदाहरण के लिए:

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:00 | 20 | 0  | 20 | 20 | 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:15 | 23 | 23 | 0  | 23 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
| 2011-04-02 06:25 | 0  | 25 | 25 | 0  | 

इससे पहले के बाद

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
+1

एक मार्ग: एनएएस के साथ शून्य को प्रतिस्थापित करके आप इसे हल कर चुके किसी समस्या को कम करें। – joran

+0

धन्यवाद जोरन, आपके उत्तर के लिए .. लेकिन, मुझे नहीं पता, एनएएस के साथ शून्य को बदलने का क्या मतलब है? क्योंकि मुझे टेबल प्राप्त करने से पहले मैंने पहले एनएएस मान हटा दिए हैं। लेकिन अभी भी 0 के मूल्य हैं। क्या आप मुझे बता सकते हैं कि यह कैसे करें? – YougyZ

+0

ठीक है मुझे लगता है कि मुझे एनएएस के साथ 0 को प्रतिस्थापित करने के लिए इस कोड का उपयोग करना होगा .. 'डेटा [जो (डेटा == 0)] = NA' – YougyZ

उत्तर

27

ऐसा करने के कई तरीके हैं। मैं apply का उपयोग कर पसंद करते हैं, क्योंकि यह आसानी बढ़ाई है:

##Generate some data 
dd = data.frame(a = 1:4, b= 1:0, c=0:3) 

##Go through each row and determine if a value is zero 
row_sub = apply(dd, 1, function(row) all(row !=0)) 
##Subset as usual 
dd[row_sub,] 
4

ठीक है, आप NA के लिए अपने 0 की अदला-बदली और फिर उन समाधानों में से एक का उपयोग कर सकता है, लेकिन एक अंतर के लिए, आप देख सकते हैं कि एक नंबर होगा केवल 0 से अधिक है, तो केवल एक सीमित लॉगेरिथम है, ताकि के rowSums केवल पंक्ति में कोई शून्य नहीं होने पर ही सीमित हो जाएंगे।

dfr[is.finite(rowSums(log(dfr[-1]))),] 
+1

+1, लेकिन मैं निश्चित रूप से अभ्यास में 'सभी'/'किसी भी समाधान को पसंद करूंगा ... –

4

मैं शायद एनओएस के साथ 0 के स्थानांतरित करने के जोरान के सुझाव के साथ जाऊंगा और फिर आपके द्वारा उल्लेखित कार्यों का उपयोग कर रहा हूं। आप नहीं कर सकते हैं/नहीं है कि, एक दृष्टिकोण any() उपयोग करने के लिए पंक्तियों को 0 के होते हैं खोजने के लिए और उन लोगों के बाहर सबसेट तक है क्या करना चाहते हैं: Joran की विधि को लागू करने के

set.seed(42) 
#Fake data 
x <- data.frame(a = sample(0:2, 5, TRUE), b = sample(0:2, 5, TRUE)) 
> x 
    a b 
1 2 1 
2 2 2 
3 0 0 
4 2 1 
5 1 2 
#Subset out any rows with a 0 in them 
#Note the negation with ! around the apply function 
x[!(apply(x, 1, function(y) any(y == 0))),] 
    a b 
1 2 1 
2 2 2 
4 2 1 
5 1 2 

, कुछ इस तरह मिलना चाहिए आप आरंभ :

x[x==0] <- NA 
+0

वैसे भी धन्यवाद, लेकिन मैंने इसे csgillespie समाधान के साथ किया है ..;) – YougyZ

0

मैं csgillespie की विधि का एक सरल अनुकूलन पसंद करते हैं, एक समारोह परिभाषा की जरूरत पूर्वगामी:

d[apply(d!=0, 1, all),] 

जहां d आप है आर डेटा फ्रेम।

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