/ / आर: एक मैट्रिक्स से सबसेट केवल उन पंक्तियों को एक निश्चित कॉलम में एक निश्चित मान के साथ - आर, लूप, सब्मिट, जो

आर: केवल एक पंक्ति में एक निश्चित मान के साथ उन पंक्तियों से एक मैट्रिक्स से सबसेट - आर, लूप, सबसेट, जो

मेरे पास आपातकाल का एक बड़ा मैट्रिक्स "dt" हैनिदान कोड के एक सेट के लिए विभाग 2 महीने से अधिक का दौरा करता है। कॉलम "आयु", "सेक्स", "तिथि", "काउंटी", "ज़िप", "सब्जेक्ट", "स्थिति", "डायग" और "डीटी" हैं; 9 द्वारा आयाम 872344 हैं।

मैं इस मैट्रिक्स को कम करना चाहता हूं और एक नई मैट्रिक्स बनाना चाहता हूं जिसमें केवल उन पंक्तियों को शामिल किया गया है जिसके लिए "डायग" कॉलम में 800 और 849 (सभी कॉलम) के बीच एक संख्या है।

मैं एक पाश और निर्माण के साथ खिलवाड़ कर रहा हूँ"जो" या "if.else" का उपयोग करते हुए, लेकिन मैं एक मानसिक ब्लॉक में दौड़ रहा हूं। ऐसा लगता है कि यह आसान होगा यदि यह सिर्फ एक डायग कोड था जिसे मैं बाहर निकालना चाहता था, लेकिन 50 कोड की श्रृंखला चीजों को जटिल करती है .. एक लूप की ओर इशारा करते हुए? क्या किसी के पास कुछ मूल्यों को खोजने के आधार पर सबसेट के लिए विचार हैं?

यहाँ मेरी शुरुआत है (यह काम नहीं किया):

dta = dt
b = 800:849
for (i in 1:length(b)) {

}

उत्तर:

जवाब के लिए 5 № 1

आपके कॉलम नामों को देखते हुए, मुझे आपके पर संदेह है dt एक डेटा.फ्रेम है, मैट्रिक्स नहीं; कुछ आप चलाकर पुष्टि कर सकते हैं is.data.frame(dt).

यदि यह मामला है, तो अपने डेटा को फ़िल्टर करने का एक आसान तरीका है subset निम्नानुसार कार्य करें:

dta <- subset(dt, diag >= 800 & diag <= 849)

जवाब के लिए 6 № 2
dta = dt[dt[, 8] >= 800 & dt[, 8] <= 849, ]

ईटीए: क्या आप सुनिश्चित हैं कि यह एक मैट्रिक्स है और डेटा नहीं है। यदि यह data.frame है, तो आप कर सकते हैं:

dta = dt[dt$diag >= 800 & dt$diag <= 849, ]

जवाब के लिए 0 № 3

उपरोक्त उत्कृष्ट उत्तरों के अलावा, मैं जोड़ सकता हूं filter में कार्य dpylr पैकेज

filter(dt,diag>=800 & diag <= 849)

filter() के समान है subset() सिवाय इसके कि आप इसे फ़िल्टर करने की कोई भी स्थिति दे सकते हैं, जो एक साथ मिलती है & (नहीं && जो गलती से करना आसान है!)। dpylr पैकेज में अन्य अच्छे डेटा मैनिपुलेटिंग फ़ंक्शंस भी होते हैं जिन्हें आप देख सकते हैं


जवाब के लिए 0 № 4

मैं रूपांतरित नहीं होता matrix() ए के लिए data.frame() जबकि यह धीमा है और अधिक से अधिक मेमोरी का उपयोग करता है matrix() ऑपरेशन आम तौर पर वैसे भी तेज होते हैं।

कॉलम संख्या अनुक्रमण का उपयोग करते हुए डेविड के उत्तर के अलावा:

dta = dt[dt[,8] >= 800 & dt[,8] <= 849,]

मैट्रिक्स के साथ स्तंभ नाम अनुक्रमण का उपयोग करने का भी रूप है:

dta = dt[dt[,"metric"] >= 800 & dt[,"metric"] <= 849,]

के रूप में दिखाया गया है microbenchmark 12 कॉलम और 13,241 पंक्तियों के साथ एक समान मैट्रिक्स के लिए पैकेज कमांड, इंटेल MKL ऑप्टिमाइज़ेशन के साथ संकलित आर के साथ चलता है:

microbenchmark::microbenchmark(
test.matrix     = mt[mt[,3] %in% 5:10 & mt[,5] == 1,],
test.data.frame = df[df[,3] %in% 5:10 & df[,5] == 1,],
times = 1000
)

Unit: microseconds
expr      min       lq     mean  median        uq        max neval
test.matrix      885.732  938.386 1154.898  943.74  952.4415 138215.318  1000
test.data.frame 1176.218 1245.826 1363.379 1258.32 1286.4320 3392.556    1000

जब मैट्रिसेस बहुत बड़े हो जाते हैं, तो यह अंतर मूर्त हो जाता है। मेरी मशीन पर, मैट्रिक्स इंडेक्सिंग गति उन में से बेहतर प्रदर्शन करती है data.table भी।