2013-02-25 11 views
7

द्वारा ठीक से संक्षेप में नहीं संक्षेप में मुझे data.table के साथ यह समस्या है जो मुझे हाल ही में पागल कर रहा है। यह एक बग की तरह दिखता है लेकिन हो सकता है कि मैं यहां कुछ स्पष्ट याद कर रहा हूं।डेटा.table दो कॉलम

# First some data 
data <- data.table(structure(list(
    month = structure(c(1356998400, 1356998400, 1356998400, 
         1359676800, 1354320000, 1359676800, 1359676800, 1356998400, 1356998400, 
         1354320000, 1354320000, 1354320000, 1359676800, 1359676800, 1359676800, 
         1356998400, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800, 
         1359676800, 1359676800, 1354320000, 1354320000), class = c("POSIXct", 
                       "POSIXt"), tzone = "UTC"), 
    portal = c(TRUE, TRUE, FALSE, TRUE, 
      TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, 
      TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE 
), 
    satisfaction = c(10L, 10L, 10L, 9L, 10L, 10L, 9L, 10L, 10L, 
        9L, 2L, 8L, 10L, 9L, 10L, 10L, 9L, 10L, 10L, 10L, 9L, 10L, 9L, 
        10L, 10L)), 
        .Names = c("month", "portal", "satisfaction"), 
        row.names = c(NA, -25L), class = "data.frame")) 

मैं portal और month दोनों से यह संक्षेप में प्रस्तुत करना चाहते हैं:

मैं निम्नलिखित डेटा फ्रेम है। - अच्छे पुराने tapply काम करता है के रूप में उम्मीद के साथ सारांश मैं दिसंबर 2012 और जनवरी-फरवरी 2013 के लिए परिणामों के साथ 3x2 मैट्रिक्स मिलती है:

> tapply(data$satisfaction, list(data$month, data$portal), mean) 
      FALSE  TRUE 
2012-12-01 8.5 8.000000 
2013-01-01 10.0 10.000000 
2013-02-01 9.0 9.545455 

data.table की by तर्क के साथ सारांश नहीं करता है:

> data[, mean(satisfaction), by = 'month,portal'] 
    month  portal  V1 
1: 2013-01-01 FALSE 10.000000 
2: 2013-02-01 TRUE 9.000000 
3: 2013-01-01 TRUE 10.000000 
4: 2012-12-01 FALSE 8.500000 
5: 2012-12-01 TRUE 7.333333 
6: 2013-02-01 TRUE 9.666667 
7: 2013-02-01 FALSE 9.000000 
8: 2012-12-01 TRUE 10.000000 

आप के रूप में देखें, यह मानों के साथ एक डेटा तालिका देता है, अपेक्षित के रूप में नहीं; मूल्य जहां portal == TRUE और month == 2012-02-01 डुप्लीकेट हैं, उदाहरण के लिए।

दिलचस्प बात यह है कि अगर मैं यह सिर्फ 2013 के डाटा की सीमा है, सब कुछ उम्मीद के रूप में काम करता है:

> data[month >= ymd(20130101), mean(satisfaction), by = 'month,portal'] 
     month portal  V1 
1: 2013-01-01 TRUE 10.000000 
2: 2013-01-01 FALSE 10.000000 
3: 2013-02-01 TRUE 9.545455 
4: 2013-02-01 FALSE 9.000000 

मैं परे हैरान हूं मानना ​​है :)। क्या कोई मेरी मदद कर सकता है?

+0

'by = list (month, portal) ' – Andrie

+0

का उपयोग करें सबसे पहले,' डेटा [, मतलब (संतुष्टि), = सूची (माह, पोर्टल) द्वारा]' वही (गलत) परिणाम उत्पन्न करता है। दूसरा, 'data.table' मदद के अनुसार, दोनों सिंटैक्स समर्थित हैं:" द्वारा - एक एकल अनगिनत कॉलम नाम, स्तंभ नामों के अभिव्यक्तियों की एक सूची(), एक एकल वर्ण स्ट्रिंग जिसमें अल्पविराम से अलग कॉलम नाम होते हैं, या एक वर्ण वेक्टर कॉलम नाम" –

+3

अपने POSIX कॉलम को दिनांक (' as.Date') में कनवर्ट करना प्रतीत होता है। मुझे लगता है कि डेटा.table है (सही ढंग से? गलत है?) कुछ बाल विभाजित हैं या नहीं, इनमें से कुछ तिथियां "बराबर" हैं। – joran

उत्तर

8

यह एक ज्ञात मुद्दा है जिसे डेटा.table 1.8.7 में हल किया गया था (अभी तक इस लेखन के रूप में सीआरएएन में नहीं)।

data.table NEWS से:

BUG FIXES 

    <...> 

o setkey could sort 'double' columns (such as POSIXct) incorrectly when not the 
    last column of the key, #2484. In data.table's C code : 
     x[a] > x[b]-tol 
    should have been : 
     x[a]-x[b] > -tol [or x[b]-x[a] < tol ] 
    The difference may have been machine/compiler dependent. Many thanks to statquant 
    for the short reproducible example. Test added. 

install.packages("data.table", repos="http://R-Forge.R-project.org") साथ 1.8.7 के लिए अद्यतन करने के बाद, सब कुछ उम्मीद के रूप में काम करता है।

5

समस्या सॉर्टिंग के साथ प्रतीत होती है। जब मैं data लोड और setkey कार्य करें:

setkey(data, "month", "portal") 

# > data 
#   month portal satisfaction 
# 1: 2012-12-01 TRUE   10 
# 2: 2012-12-01 FALSE   9 
# 3: 2012-12-01 FALSE   8 
# 4: 2012-12-01 TRUE   2 
# 5: 2012-12-01 TRUE   10 
# 6: 2012-12-01 TRUE   10 
# 7: 2013-01-01 TRUE   10 
# 8: 2013-01-01 TRUE   10 
# 9: 2013-01-01 TRUE   10 
# 10: 2013-01-01 TRUE   10 
# 11: 2013-01-01 TRUE   10 
# 12: 2013-01-01 TRUE   10 
# 13: 2013-01-01 FALSE   10 
# 14: 2013-02-01 TRUE   9 
# 15: 2013-02-01 TRUE   9 
# 16: 2013-02-01 FALSE   9 
# 17: 2013-02-01 TRUE   10 
# 18: 2013-02-01 TRUE   10 
# 19: 2013-02-01 TRUE   10 
# 20: 2013-02-01 TRUE   10 
# 21: 2013-02-01 TRUE   10 
# 22: 2013-02-01 TRUE   9 
# 23: 2013-02-01 TRUE   10 
# 24: 2013-02-01 TRUE   9 
# 25: 2013-02-01 TRUE   9 
#   month portal satisfaction 

आप देखते हैं कि portal स्तंभ ठीक से पृथक नहीं किया जा रहा है। जब मैं setkey फिर से करते हैं,

setkey(data, "month", "portal") 

# I get this warning message: 
Warning message: 
In setkeyv(x, cols, verbose = verbose) : 
    Already keyed by this key but had invalid row order, key rebuilt. 
    If you didn't go under the hood please let datatable-help know so 
    the root cause can be fixed. 

अब, data कॉलम लगते ठीक से कुंजी कॉलम के अनुसार क्रमबद्ध:

# > data 
#   month portal satisfaction 
# 1: 2012-12-01 FALSE   9 
# 2: 2012-12-01 FALSE   8 
# 3: 2012-12-01 TRUE   10 
# 4: 2012-12-01 TRUE   2 
# 5: 2012-12-01 TRUE   10 
# 6: 2012-12-01 TRUE   10 
# 7: 2013-01-01 FALSE   10 
# 8: 2013-01-01 TRUE   10 
# 9: 2013-01-01 TRUE   10 
# 10: 2013-01-01 TRUE   10 
# 11: 2013-01-01 TRUE   10 
# 12: 2013-01-01 TRUE   10 
# 13: 2013-01-01 TRUE   10 
# 14: 2013-02-01 FALSE   9 
# 15: 2013-02-01 TRUE   9 
# 16: 2013-02-01 TRUE   9 
# 17: 2013-02-01 TRUE   10 
# 18: 2013-02-01 TRUE   10 
# 19: 2013-02-01 TRUE   10 
# 20: 2013-02-01 TRUE   10 
# 21: 2013-02-01 TRUE   10 
# 22: 2013-02-01 TRUE   9 
# 23: 2013-02-01 TRUE   10 
# 24: 2013-02-01 TRUE   9 
# 25: 2013-02-01 TRUE   9 
#   month portal satisfaction 

इसलिए, यह एक POSIXct + logical प्रकार sortting के साथ एक समस्या हो रहा है?

data[, mean(satisfaction), by=list(month, portal)] 

#   month portal  V1 
# 1: 2012-12-01 FALSE 8.500000 
# 2: 2012-12-01 TRUE 8.000000 
# 3: 2013-01-01 FALSE 10.000000 
# 4: 2013-01-01 TRUE 10.000000 
# 5: 2013-02-01 FALSE 9.000000 
# 6: 2013-02-01 TRUE 9.545455 

इसलिए मुझे लगता है कि एक बग है।

+2

हाँ, मैं बस एक टिप्पणी छोड़ने वाला था कि अगर @MatthewDowle इस दिन इस पर वजन नहीं उठाता या दो, ओपी को शायद इस प्रश्न को डेटा.table मेलिंग सूची पर पोस्ट करना चाहिए। – joran

+1

आह! धन्यवाद अरुण, वास्तव में यह मामला प्रतीत होता है। मैं इसे मेलिंग सूची में एक बग के रूप में रिपोर्ट करूंगा। हम आपके जवाब को स्वीकार करने से पहले मामले में मैथ्यू को जवाब देने का इंतजार करेंगे। –

+0

@ जोरान, विजेता, यकीन है। – Arun

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