2015-12-04 6 views
10

से निपटने में डेटा.table के कुछ अजीब व्यवहार को नोटिस किया गया है, उम्मीद है कि कोई भी जो आंकड़ों को समझता है उससे बेहतर है।डेटाटेबल "सूची" बनाम ": =" NaN

मैं इस data.table है कहते हैं:

library(data.table) 
DT <- data.table(
    C1 = c(rep("A", 4), rep("B",4), rep("C", 4)), 
    C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)), 
    Val = c(1:5, NaN, NaN, 8,9,10,NaN,12)) 

DT 
    C1 C2 Val 
1: A a 1 
2: A a 2 
3: A a 3 
4: A b 4 
5: B b 5 
6: B b NaN 
7: B c NaN 
8: B c 8 
9: C c 9 
10: C d 10 
11: C d NaN 
12: C d 12 

अब, मेरे मन में, निम्नलिखित दो तरीकों में एक ही परिणाम उत्पन्न करना चाहिए, लेकिन वे नहीं है।

TEST1 <- DT[, agg := min(Val, na.rm = TRUE), by = c('C1', 'C2')] 
TEST1 <- data.table(unique(TEST1[, c('C1','C2','agg'), with = FALSE])) 

TEST2 <- DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')] 

TEST1 
    C1 C2 agg 
1: A a 1 
2: A b 4 
3: B b 5 
4: B c 8 
5: C c 9 
6: C d 10 


TEST2 
    C1 C2 agg 
1: A a 1 
2: A b 4 
3: B b 5 
4: B c NaN 
5: C c 9 
6: C d 10 

आप देख सकते हैं, का उपयोग करते हुए ": =" के लिए 8. एक NaN में सूची आदेश परिणाम जबकि की (C1 = बी, सी 2 = ग) एक न्यूनतम मूल्य उत्पन्न करता है। मज़ेदार रूप से पर्याप्त, (सी 1 = बी, सी 2 = बी) और (सी 1 = सी, सी 2 = डी), जिसमें नाएन भी हैं, सूची कमांड एक मूल्य उत्पन्न करता है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि उदाहरण के दौरान, NaN किसी दिए गए सी 1 सी 2 संयोजन के लिए मूल्य से पहले पहले है, NaN परिणाम। जबकि अन्य दो उदाहरणों में नाएन एक मूल्य के बाद आता है।

ऐसा क्यों होता है?

मुझे नोट है कि यदि NaN को NA के साथ प्रतिस्थापित किया गया है तो मूल्यों को बिना किसी समस्या के उत्पन्न किया जाता है।

+1

पता नहीं लेकिन 'डीटी [, सूची (agg = मिनट (.SD $ वैल, na.rm = TRUE)), = द्वारा ग ('सी 1', 'सी 2')]' भी काम करता है – rawr

+1

या 'डीटी [, सूची (एजीजी = मिनट (सी (वैल), na.rm = TRUE)), द्वारा =। (सी 1, सी 2)] 'यह थोड़ा अजीब है, लेकिन' dplyr' में समकक्ष कदम कनवर्ट करने के बाद काम करता है 'data.frame' पर। – akrun

+1

आपको निश्चित रूप से एक बग की रिपोर्ट करनी चाहिए। मुझे संदेह है कि यह 'data.table'' min' फ़ंक्शन के "आंतरिक" कार्यान्वयन के कारण है। जब 'data.table' ऑपरेशन के अंदर, कुछ फ़ंक्शन (जैसे 'min',' max' और 'sum') को तेज़' data.table' संस्करणों द्वारा प्रतिस्थापित किया जाता है। यदि आप स्पष्ट रूप से 'आधार' फ़ंक्शन को कॉल करते हैं, तो आपको सही आउटपुट मिलता है: 'डीटी [, सूची (agg = base :: min (Val, na.rm = TRUE)), = c ('C1', 'C2')] '। कोई विचार नहीं कि 'data.table'' base = min' पर वापस क्यों प्रतीत होता है जब ': =' के साथ संयोजन में उपयोग किया जाता है। – nicola

उत्तर

7

इस समस्या को ठीक किया गया, #1461 अभी डेवेल में, v1.9.7 commit 2080 के साथ।

require(data.table) # v1.9.7, commit 2080+ 
DT <- data.table(
    C1 = c(rep("A", 4), rep("B",4), rep("C", 4)), 
    C2 = c(rep("a", 3), rep("b",3), rep("c",3), rep("d",3)), 
    Val = c(1:5, NaN, NaN, 8,9,10,NaN,12)) 

DT[, list(agg = min(Val, na.rm = TRUE)), by = c('C1', 'C2')] 
# C1 C2 agg 
# 1: A a 1 
# 2: A b 4 
# 3: B b 5 
# 4: B c 8 
# 5: C c 9 
# 6: C d 10 
संबंधित मुद्दे