2012-03-23 13 views
5

उदाहरण के लिए नकली डेटा के रूप में लागू नहीं की गिनती करते हुए:आर: मैं कैसे परिवर्तनीय घटकों में जोड़ सकते हैं, मामलों के भीतर, शून्य

df <- data.frame(a=c(1,2,3,4,5), b=(c(2,2,2,2,NA)), 
       c=c(NA,2,3,4,5))) 

यह मैं इस सवाल का जवाब मैं चाहते हैं यह एनए मूल्यों के लिए नहीं थे मिलेगा:

df$count <- with(df, (a==1) + (b==2) + (c==3)) 

इसके अलावा, अगर मैं केवल दिलचस्पी लेता, तो एक और अधिक सुरुचिपूर्ण तरीका होगा, उदाहरण के लिए चर == 2?

df$count <- with(df, (a==2) + (b==2) + (c==2)) 

बहुत धन्यवाद!

+0

एक अच्छा सवाल के लिए +1 और बेहतर प्रयोक्ता नाम :) – Tommy

उत्तर

5

अपने विशिष्ट उदाहरण के लिए निम्नलिखित काम करता है, लेकिन मैं एक संदेह है कि अपने वास्तविक उपयोग के मामले और अधिक जटिल है:

df$count <- apply(df,1,function(x){sum(x == 1:3,na.rm = TRUE)}) 
> df 
    a b c count 
1 1 2 NA  2 
2 2 2 2  1 
3 3 2 3  2 
4 4 2 4  1 
5 5 NA 5  0 

लेकिन यह सामान्य दृष्टिकोण काम करना चाहिए। उदाहरण के लिए, अपने दूसरे उदाहरण कुछ इस तरह होगा:

df$count <- apply(df,1,function(x){sum(x == 2,na.rm = TRUE)}) 

या अधिक आम तौर पर आप अपने आप को तुलना के लिए एक चर में पारित करने के लिए अनुमति दे सकता है:

df$count <- apply(df,1,function(x,compare){sum(x == compare,na.rm = TRUE)},compare = 1:3) 
+0

बढ़िया, यह सब कुछ मुझे चाहिए! –

2

एक और तरीका है अपने लक्ष्य वेक्टर घटाना है अपने data.frame की प्रत्येक पंक्ति से, नकारना और उसके बाद करना rowSumsna.rm=TRUE साथ:

target <- 1:3 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 2 1 2 1 0 

target <- rep(2,3) 
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE) 
[1] 1 3 1 1 0 
+0

मुझे एक और तरीका दिखाने के लिए धन्यवाद :) –

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