2012-05-07 12 views
5

में दिखाई देने वाले ब्याज के मूल्यों के सेट के आधार पर डेटा फ्रेम से पंक्तियों का चयन करना मेरे पास डॉक्टर के दौरे के रिकॉर्ड का एक बड़ा डेटाफ्रेम है। मैं केवल उन्हीं पंक्तियों का चयन करना चाहता हूं जिनमें सूचीबद्ध 11 निदान कोडों में से कम से कम एक निदान कोड के निर्दिष्ट सेट में पाया गया है, जिसमें मुझे रूचि है।आर: कुछ कॉलम

डेटाफ्रेम 18,019 पंक्तियों में 18 कॉलम है। मुझे कॉलम 6:16 में निदान कोड में दिलचस्पी है। यहाँ इन 11 निदान स्तंभों के लिए एक डेटा नमूना है केवल (पहचान योग्य जानकारी की रक्षा के लिए): 2 में,

mydiag <- c(401, 410, 411, 413, 415:417, 420:429, 434, 435, 444, 445, 451, 460:466, 480:486, 490:493, 496, 786) 
y = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x) sum((any(x !=NA %in% mydiag)))) 
y = as.data.frame(y) 

आप देख सकते हैं:

diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11 
786 272 401 782 250 91912 530 NA NA NA  NA 
845 530 338 311 NA NA NA  NA NA NA  NA 

यहाँ कोड मैं का उपयोग करने की कोशिश की है है उदाहरण पंक्तियों को मैंने प्रदान किया है, मैं पहली पंक्ति रखना चाहता हूं लेकिन दूसरी पंक्ति को फेंकना चाहता हूं क्योंकि इसमें मेरे कोई भी कोड नहीं है। मेरे द्वारा प्रदान किया गया कोड नमूना काम नहीं करता है- मुझे 39,01 9 "1" मानों का वेक्टर मिलता है। इसलिए मैं अनुमान लगा रहा हूं कि आवेदन कथन किसी भी तरह तार्किक के रूप में पढ़ा जा रहा है, और फिर भी मुझे इस तथ्य के बारे में पता है कि सभी पंक्तियों में रुचि का कोई कोड नहीं है, इसलिए उस मामले में मुझे 1 और 0 की उम्मीद होगी।

क्या इस पंक्ति चयन कार्य को करने का कोई बेहतर तरीका है?

उत्तर

5

मुझे लगता है कि तुम वहाँ में !=NA बिट के साथ बातें overcomplicating रहे हैं। चूंकि NA mydiag में प्रकट नहीं होता है, इसलिए आप इसे पूरी तरह से छोड़ सकते हैं। तो आपका आवेदन कथन तब बन सकता है:

goodRows <- apply(dat, 1, function(x) any(x %in% mydiag)) 
dat[goodRows,] 
#--------------- 
    diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11 
1 786 272 401 782 250 91912 530 NA NA  NA  NA 
2

समस्या अपने कार्य function(x) sum((any(x !=NA %in% mydiag)))

x != NA बेहतर !is.na(x) का प्रयोग कर बनाया जा सकता है से आता है, लेकिन आप यह समझना चाहिए कि यह एक तार्किक वेक्टर देता है। तो आप लॉजिकल वेक्टर का परिणाम ले रहे हैं और फिर जांच कर रहे हैं कि परिणाम mydiag में है या नहीं। मुझे लगता है कि आप सिर्फ उन मूल्यों को लेना चाहते हैं जो ना नहीं हैं और जांचें कि इनमें से कोई भी mydiag में है या नहीं।

x[!is.na(x)] %in% mydiag 

इसके लिए बहुत बेहतर काम करेगा। लेकिन क्या तुम सच में भी के बाद से एनए अपने वेक्टर में एक्स में तो किसी भी तत्व है कि एनए के लिए x %in% mydiag

function(x){any(x %in% mydiag)} 

अवास्तविक लौटाते हैं नहीं है NAS की जाँच करने की जरूरत नहीं है किसी तार्किक मान कह पाने के लिए एक अच्छा तरीका है यदि आप पंक्ति आपके मानदंडों को पूरा करती है या नहीं।

# Get the row numbers of the rows you want 
id = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x){any(x %in% mydiag)}) 
# Just grab those rows 
y <- dt[id, ] 
+0

बहुत बहुत धन्यवाद! तुम सही हो- और अब मुझे याद है कि मैं खुद से आगे निकल रहा था। मैं "एनएएस" को बाहर करना चाहता था क्योंकि मैं राशि ले रहा था- जब मैं इस सवाल को लिखना शुरू कर दिया था तो मैं पूरी तरह से भूल गया था। इसलिए, अगर मैं यह जानना चाहता था कि प्रत्येक पंक्ति के लिए कितने कुल निदान सूचीबद्ध किए गए थे (ऊपर दिए गए उदाहरण में 7 और 4 होगा), यह मेरा पहला प्रयास है: id2 = लागू (y [, पेस्ट ("डायग", 1:11, sep = "")], 1, फ़ंक्शन (x) योग ({कोई भी (x [! Is.na (x)])}) – mEvans

+0

'sum' में एक na.rm तर्क है जो देना होगा आप यह सब छोड़ दें। इसके अलावा ... यह मामला कभी भी है कि कुछ भी "== NA" और इसके विपरीत कभी भी मामला नहीं है "! = NA"। नतीजा हमेशा होगा ... एनए। तो शायद ... 'id2 = लागू करें (y [, पेस्ट (" डायग ", 1:11, sep =" ")], 1, फ़ंक्शन (x) {sum (कोई भी (x), na.rm = TRUE) })) ' –