2013-02-07 24 views
9

आउटपुट format को बदलने के लिए मैंने अपनी खुद की कक्षा numeric पर संलग्न करने का प्रयास किया है। यह ठीक काम करता है, लेकिन जब मैं समूह by समूह करता हूं तो कक्षा वापस संख्या में वापस आती है।डेटा.table समूह के बाद एसएसडी में वर्ग परिभाषा क्यों खो देता है?

उदाहरण: मेरी कक्षा के लिए एक नया प्रारूप समारोह को परिभाषित करें:

format.myclass <- function(x, ...){ 
    paste("!!", x, "!!", sep = "") 
} 

तो एक छोटा सा data.table बनाने के लिए और स्तंभों में से एक को बदलने MyClass के लिए:

> DT <- data.table(L = rep(letters[1:3],3), N = 1:9) 
> setattr(DT$N, "class", "myclass") 
> DT 
    L  N 
1: a !!1!! 
2: b !!2!! 
3: c !!3!! 
4: a !!4!! 
5: b !!5!! 
6: c !!6!! 
7: a !!7!! 
8: b !!8!! 
9: c !!9!! 

अब से एक समूह प्रदर्शन करते हैं और एन कॉलम पूर्णांक में बदल जाता है:

> DT[, .SD, by = L] 
    L N 
1: a 1 
2: a 4 
3: a 7 
4: b 2 
5: b 5 
6: b 8 
7: c 3 
8: c 6 
9: c 9 

> DT[, sapply(.SD, class), by = L] 
    L  V1 
1: a integer 
2: b integer 
3: c integer 

कोई विचार क्यों?

उत्तर

8

क्योंकि जब भी आर वेक्टर को सब्सक्राइब करता है तो यह कक्षा को फेंक देता है। क्यूं कर? खैर, क्योंकि यह एक गधे है, यही कारण है कि। आपको एक "[" -सब्सेट विधि लिखनी होगी।

> DT[,N] 
[1] 1 2 3 4 5 6 7 8 9 
attr(,"class") 
[1] "myclass" 
> DT[1:2,N] 
[1] 1 2 

देखें कि वेक्टर ने वर्ग को कैसे हटा दिया है? यही समस्या है। data.table किसी भी समय अपने वेक्टर को ऐसा कर रहा है। एक "[" विधि लिखें (केवल उस तारीख को कॉपी करें जो दिनांक उपयोग करता है):

"[.myclass"= function (x, ..., drop = TRUE){ 
    cl <- oldClass(x) 
    class(x) <- NULL 
    val <- NextMethod("[") 
    class(val) <- cl 
    val 
} 

> DT[1:2,N] 
[1] 1 2 
attr(,"class") 
[1] "myclass" 

और अब इसमें कुछ वर्ग है।

> DT[, sapply(.SD, class), by = L] 
    L  V1 
1: a myclass 
2: b myclass 
+2

"गधे" के लिए +1 पर रिपोर्ट करने के लिए कोरोन के लिए धन्यवाद। और एक महान उत्तर – Corone

+3

+1 भी। मैंने शपथ ली होगी 'एसडी' कॉलम विशेषताओं को बनाए रखा लेकिन स्पष्ट रूप से नहीं। क्या यह ठीक होगा, जब तक कि कोई नकारात्मक न हो? (मुझे पता है कि कोई प्रदर्शन नकारात्मक नहीं होगा, इसलिए मेरा मतलब अन्यथा है)। –

+2

मुझे सच में नहीं पता कि यह डिफ़ॉल्ट व्यवहार क्यों नहीं है। या अलग-अलग उपनामों के तहत सीआरएएन पर "[डेट" की कितनी प्रतियां बैठे हैं। असली समाधान "तिथि" से उप-वर्ग होना होगा और उस सबसेट फ़ंक्शन को मुफ्त में प्राप्त करना होगा :) j/k – Spacedman