2017-11-22 18 views
5

से मैं data.table उपयोग करना चाहते हैं, लेकिन j भाग की गणना छोड़ by लापता से मेल खाती है, तो चाहते हैं (NA):छोड़ें एनए

यहाँ एक उदाहरण data.table

है
library(data.table) 
DT <- data.table(y=10, g=c(1,1,1,2,2,2,2,2,NA,NA)) 

यह इस

> DT 
    y g 
1: 10 1 
2: 10 1 
3: 10 1 
4: 10 2 
5: 10 2 
6: 10 2 
7: 10 2 
8: 10 2 
9: 10 NA 
10: 10 NA 

तरह लग रहा है अब मैं by=पर क्या करना चाहते हैंऔर दो पंक्तियों 9 और 10 को एक साथ लम्बा कर दिया जाएगा क्योंकि उनके पास समान मूल्य NA है।

> DT[,.N, by=g] 
    g N 
1: 1 3 
2: 2 5 
3: NA 2 

मैं उत्पादन में NA लाइन रखना चाहते हैं, लेकिन परिणाम में calculate हिस्सा है, यानी छोड़ना चाहते हैं।,, आउटपुट प्राप्त जहां N रिक्त है जब gNA

> DT[,.N, by=g] 
    g N 
1: 1 3 
2: 2 5 
3: NA NA 
है

मैंने सोचा कि मैं g के .GRP के माध्यम से उपयोग कर सकता हूं लेकिन यह केवल समूह सूचकांक देता है, न कि मूल्य। क्या by वैरिएबल की अनुपस्थित स्थिति पर गणना को सशर्त बनाना संभव है?

+3

आपके समूह चर के _value_ _can_ को 'j' में एक्सेस किया जाना चाहिए - यदि' j' में उपयोग किया जाता है तो इसकी लंबाई लंबाई होती है (देखें [FAQ 2.10 प्रत्येक समूह के अंदर, समूह चर लंबाई -1 क्यों हैं?] (Https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#inside-each-group-why-are-the-group-variables-length-1)। तो कुछ 'डीटी [, अगर (! is.na (g))। (n =।) अन्यथा NA_integer_, द्वारा = g] 'काम करेगा। – Henrik

+3

' i' तर्क में '! is.na (g) 'द्वारा फ़िल्टरिंग में क्या गलत है? 'डीटी [! Is.na (g), एन, द्वारा = जी]' –

+0

@ स्कॉट्रिची मुझे लगता है कि परिणाम से 'एनए लाइन को हटा देगा। मैं अभी भी इसे बाद में शामिल करने के लिए चाहता हूं। – ekstroem

उत्तर

4

आपको यह एक कोशिश कर सकते हैं:

DT[, .N * NA^is.na(g), by = g] 
g V1 
1: 1 3 
2: 2 5 
3: NA NA 

यह Henrik'sif ... else ... खंड के एक बीजीय संस्करण है। यह तथ्य यह है कि NA^0 रिटर्न 1 जबकि NA^1 रिटर्न NA और उस FALSE और TRUE0 और 1, resp के लिए मजबूर किया जा सकता है का उपयोग करता है।

आप स्तंभ नाम नियंत्रित करना चाहते हैं: वैकल्पिक रूप से

DT[, .(n = .N * NA^is.na(g)), by = g] 
g n 
1: 1 3 
2: 2 5 
3: NA NA 

, ऊपर मुश्किल प्रतीत होता है अगर आप data.table श्रृंखलन का सहारा कर सकते हैं (इस को लाने के लिए Sotos करने के लिए धन्यवाद):

DT[, .N, by = g][is.na(g), N := NA][] 

यह N के योग को aggregati के बाद बदल देगा पर।

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