2012-06-13 8 views
9

मेरे पास डेटा जैसे फ्रेम (49,000 तक 20,000 पंक्तियां) हैं। प्रत्येक पंक्ति में एक अद्वितीय नाम (आईडी) होता है, प्रत्येक आईडी में 3 कॉलम 3 कॉलम में पढ़ा जाता है (उदा। डी 15 सी डी 15 सी .1 डी 15 सी 2)। उपनामों के पहले 4 अक्षर ("डी 15 सी") समूह के नाम हैं। मुझे समूह नामों (जैसे औसत डी 15 सी, डी 15 सी .1 और डी 15.2) प्राप्त करने के लिए स्तंभों को औसत करने की आवश्यकता है, इसलिए अंतिम तालिका 49 कॉलम से 16 कॉलम तक समेकित की जाएगी।आर पंक्ति समूह (या अद्वितीय आईडी) द्वारा कई कॉलम पर है

  ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2 
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52 
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76 
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47 
(… 20000 rows)            

मैं स्थानांतरित और व्यवस्था कुल का उपयोग करने के निम्न डेटा फ्रेम करने के लिए इसे संपादित:

 ID 1367452_at 1367453_at 1367454_at ... ... 
1 D04C  11.11  9.65  10.19 
2 D04C  10.93  9.94  10.36 
3 D08H  11.85  9.78  9.68 
4 D08H  10.94  9.68  10.07 
5 D08H  10.87  9.67  10.08 
6 D15C  10.73  9.86  10.35 
7 D15C  10.62  9.71  10.26 
8 D15C  10.85  9.82  10.32 
9 D15L  10.73  9.74  10.27 
10 D15L  10.77  9.71  10.19 
11 D15L  10.52  9.76  10.47 

लेकिन, निम्नलिखित कुल ("agg" डेटा फ्रेम नाम है) पूरा करने के लिए 370 सेकंड । समस्या यह है कि मैं इंतज़ार कर रहा टेबल इस तरह के 100 के है ......

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T) 

तो मैं इसे एक data.table में बदला जाएगा और डेटा तालिका विधि चलाते हैं।

Error: cannot allocate vector of size 144 Kb 
In addition: Warning messages: 
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size) 

सुनिश्चित नहीं हैं कि क्या गलत है:

dt <- as.data.table(agg) 
setkey(dt, ID) 
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

लेकिन कुछ ही मिनटों के बाद एक त्रुटि संदेश मिला। डीटी के "सिर" भाग को देखने के लिए डीटी [1: 5,1: 5] का उपयोग नहीं कर सकते हैं, और सिर (डीटी) छत के माध्यम से चलने वाली कई रेखाएं लौटाता है, मैं या तो "सिर" नहीं देख सकता। पता नहीं अब क्या करना है।

मैं आईडी को एक कॉलम (डेटा.फ्रेम में) में सूचीबद्ध कर सकता हूं या तालिका को ट्रांसफर कर सकता हूं और आईडी को पहली पंक्ति में (डेटाटेबल में) सूचीबद्ध कर सकता हूं। किसी भी तरह से, डेटा एकत्र करने के लिए कोई तेज तरीका है? बहुत ज्यादा अधिमूल्यित!

+0

पहला प्रश्न एह? स्वागत हे। क्या आप वास्तव में 'data.table' पैकेज में डेटा.table का मतलब है? यदि आपने 'ट्रांसफर' और 'समेकित' करने का प्रयास किया है तो आपके द्वारा किए गए सटीक आदेश प्रदान करना सबसे अच्छा है ताकि लोग सहायता कर सकें। 'डेटा.table विधि' से आपका क्या मतलब है इसका कोई मतलब नहीं है। स्टैक ओवरफ़्लो पर कहीं अच्छे प्रश्न पूछने के लिए शायद कुछ दिशानिर्देश हैं (लेकिन मैं उन्हें जल्दी नहीं कर सकता)। सलाह मांगने के लिए आर चैट रूम आज़माएं। –

+0

क्षमा करें यह स्पष्ट नहीं था। मैंने इसे अधिक जानकारी प्रदान करने के लिए संपादित किया है। उम्मीद है कि अब यह और अधिक समझ में आता है। – user1444754

+0

बहुत बेहतर, धन्यवाद। इसने जवाब देने में बहुत जल्दी बना दिया। –

उत्तर

12

यह:

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

सिर्फ होना चाहिए:

dt2 <- dt[, lapply(.SD,mean), by=ID] 

dt[2:ncol(dt)] तथ्य पंक्तियों का एक सबसेट लेने में था।

data.table सिंटैक्स सीखने का एक त्वरित तरीका प्रॉम्प्ट पर example(data.table) चलाएं और प्रॉम्प्ट पर उदाहरणों के माध्यम से कार्य करें। यदि आप इसे "समूह द्वारा कॉलम के माध्यम से आवेदन करने" के लिए खोजते हैं तो आपको बिल्कुल यह उदाहरण मिल जाएगा।

और .SD जानने के लिए, सबसे अच्छा तरीका है स्ट्रिंग ".SD" के लिए ?data.table खोज करने के लिए है और फिर भी इस data.table टैग में कुछ अच्छे सवाल और .SD के बारे में बहुत विस्तृत जवाब जो एक खोज द्वारा दिया जाता है "[data.table ] एसएसडी "।

+0

धन्यवाद मैथ्यू। आपका कोड खूबसूरती से काम करता है। मैंने बस एसडी में देखना शुरू कर दिया और आज सुबह उदाहरण चलाए। वैसे, क्या पहली पंक्ति (यानी ट्रांसपोज़ेड टेबल) पर समूह (यानी आईडी) के साथ डेटा को संभालने का कोई तरीका है?कारण मैं पूछता हूं कि आर लंबा [30,000, 3,000], व्यापक [3,000, 30,000], टेबल बेहतर नहीं लगता है। उदाहरण के लिए, लिखने योग्य में 1 सेकंड लगता है। यह लंबा है, लेकिन एक ही आकार की ट्रांसपोज़ेड विस्तृत तालिका को बचाने के लिए 5 मिनट। इसलिए मुझे हमेशा सहेजने से पहले तालिका को स्थानांतरित करना होगा, और उस पर परिचालन करने से पहले तालिका को स्थानांतरित करना होगा। क्या यह "मेरी" अनूठी समस्या है? – user1444754

+1

@ उपयोगकर्ता 1444754 खुशी है कि यह अब काम करता है। मेरे उत्तर के लिए वोट देना न भूलें और इसे स्वीकार करें (इसे टिकटें) कृपया। ताकि दूसरों को पता चले कि यह हल हो गया है। इस टिप्पणी पर यह एक नए प्रश्न के लिए उपयुक्त लगता है। एक प्रतिकूल उदाहरण प्रदान करने के लिए सर्वश्रेष्ठ है कि एक उत्तरदाता एक नया आर सत्र में पेस्ट कर सकता है ताकि आप यह देख सकें कि आपका क्या मतलब है, जल्दी से। –

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