मेरे पास आपातकाल का एक बड़ा मैट्रिक्स "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
भी।