2014-10-16 4 views
9

में data.table का उपयोग कर मैं निम्नलिखित है डाटासेटजब आर

> head(DT) 
    V1 V2 V3 V4 V5  V6 V7 
1: 2 1 2 0.91 0.02 880.00 1 
2: 3 2 1 0.02 0.00 2.24 2 
3: 1 1 1 0.15 0.01 3.41 3 
4: 1 2 1 3.92 0.05 268.67 2 
5: 1 1 2 0.10 0.01 1.59 3 
6: 0 1 1 1.20 0.04 1.43 3 

> sapply(DT, class) 
     V1  V2  V3  V4  V5  V6  V7 
"integer" "integer" "integer" "numeric" "numeric" "numeric" "factor" 

जो पंक्तियों के हजारों के लिए फैलता है एक त्रुटि लौटने माध्य।

> DT[, lapply(.SD, median), by = V7] 
Error in `[.data.table`(DF, , lapply(.SD, median), by = V7) : 
Column 1 of result for group 4 is type 'integer' but expecting type 'double'. Column types must be consistent for each group. 
: मैं मैं निम्न आदेश है, जो एक त्रुटि देता है का उपयोग कर रहा फिलहाल कारक परिवर्तनीय V7

> levels(DT$V7) 
[1] "1" "2" "3" "4" "5" "6" "7" "8" 

द्वारा परिभाषित 8 समूहों के भीतर V1-वी 6 की औसत मूल्यों की गणना करने कोशिश कर रहा हूँ

मैंने कहीं पढ़ा है कि इसके आसपास एक रास्ता as.double(median(X)) का उपयोग कर रहा था। लेकिन इस अलग-अलग स्तंभों के लिए काम करता है: DT[, as.double(median(X)), by = V7], लेकिन नहीं जब सभी स्तंभों पर विचार के लिए: DT[, lapply(.SD, as.double(median)), by = V7] (अपेक्षित रूप से, क्योंकि आप मंझला के लिए एक इनपुट पारित करने के लिए है)

मैं कुल

> aggregate(DT[,c(1:6), with = FALSE], by = list(DF$V7), FUN = median) 
    Group.1 V1 V2 V3  V4 V5  V6 
    1  1 0 1 1 1.285 0.04 401.500 
    2  2 1 2 1 3.565 0.06 6.400 
    3  3 0 1 1 0.360 0.03 11.200 
    4  4 1 1 1 74.290 0.26 325.960 
    5  5 2 1 0 1.145 0.04 1.415 
    6  6 0 1 1 10.100 0.18 93.000 
    7  7 1 1 0 0.740 0.04 1.080 
    8  8 1 1 0 7.970 0.40 0.050 

का उपयोग करके आसपास पहुंच सकते हैं लेकिन मैं अगर वहाँ data.table

+0

उपयोग हमेशा की तरह 'lapply' वाक्य रचना: (' lapply .SD, फ़ंक्शन (x) as.numeric (median (x))) '। 'Lapply' का दूसरा तर्क एक समारोह होना चाहिए। – Roland

उत्तर

12

median असामान्य है, क्योंकि यह एक ही इनपुट प्रकार के लिए वापसी मूल्यों के विभिन्न प्रकार लौट सकते हैं का उपयोग कर ऊपर वर्णित त्रुटि को हल करने और इस गणना करने के लिए एक तरीका है पता करने के लिए करना चाहते हैं:

The default method returns a length-one object of the same type as x, except when x is integer of even length, when the result will be double.

हालांकि, डेटाटेबल को लगातार वापसी मूल्य प्रकार की आवश्यकता होती है। सांख्यिक को

Convert सभी स्तंभों:: आप दो संभावनाएं है

DT[, paste0("V", 1:6) := lapply(.SD, as.numeric), by = V7] 

या median के रिटर्न मान परिवर्तित:

DT[, lapply(.SD, function(x) as.numeric(median(x))), by = V7]