2014-05-07 8 views
5

मेरे पास एक समान प्रश्न है: R: data.table : searching on multiple columns AND setting data type, लेकिन इस प्रश्न का पूरी तरह उत्तर नहीं दिया गया। मेरे पास एक जोड़ीदार सारणी है जो अवधारणात्मक रूप से नीचे की तरह दिखती है। तालिका एक बहुत बड़ी दूरी मैट्रिक्स को डेटा.table (> 100,000,000 पंक्तियों) में परिवर्तित करने का परिणाम है, जैसे तुलना ए, बी बी, ए के समान है। हालांकि ए और बी कॉलम वी 1 या वी 2 में दिखाई दे सकते हैं। मैं डेटा.table की क्वेरीिंग शैली का उपयोग करके सरल सारांश आंकड़ों की गणना करना चाहता हूं, लेकिन मुझे यह पता नहीं लगा है कि कॉलम में कुंजियों का चयन कैसे करें। क्या यह संभव है?आर एकाधिक कॉलमों में सारांश आंकड़ों की गणना के लिए डेटाटेबल

मैंने किसी भी दिशा में कुंजी सेट करने का प्रयास किया है, लेकिन यह केवल उस कॉलम के लिए डेटा देता है। मैंने सूची() का उपयोग करने का भी प्रयास किया, लेकिन यह चौराहे (समझ में आता है) देता है, मुझे उम्मीद है कि एक by = key1 | key2, लेकिन ऐसी कोई किस्मत नहीं है।


> set.seed(123) 
> 
> #create pairwise data 
> a<-data.table(t(combn(3,2))) 
> #create column that is equal both ways, 1*2 == 2*1 
> dat<-a[,data:=V1*V2] 
> dat 
    V1 V2 data 
1: 1 2 2 
2: 1 3 3 
3: 2 3 6 
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2) 

> #set keys 
> setkey(dat,V1,V2) 
> 
> #One way data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.5 0.5 
2: 1 3 3 2.5 0.5 
3: 2 3 6 6.0 NA 

> #The other way 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.0 NA 
2: 1 3 3 4.5 4.5 
3: 2 3 6 4.5 4.5 
> 
> #The intersect just produces the original data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2 NA 
2: 1 3 3 3 NA 
3: 2 3 6 6 NA 
> 
> #Meaningless but hopefull attempt. 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2] 
> dat 
    V1 V2 data  MEAN  VAR 
1: 1 2 2 3.666667 4.333333 
2: 1 3 3 3.666667 4.333333 
3: 2 3 6 3.666667 4.333333 
#The goal is to create a table would look like this (using mean as an example) 
ID MEAN 
1 2.5 
2 4.0 
3 4.5 

मेरे डिफ़ॉल्ट विचारों भी एक Dat के माध्यम से लूप होगा [V1 == x | V2 == x] बयान है, लेकिन मुझे नहीं लगता मैं data.table की पूरी शक्ति का दोहन कर रहा हूँ है सारांश कॉलम के रूप में var के साथ ids के एकल कॉलम को वापस करने के लिए।

धन्यवाद!

+1

वास्तव में क्या आपके की उम्मीद है परिणाम यहाँ? – eddi

+0

आशावादी परिणाम को प्रतिबिंबित करने के लिए संपादित किया गया है, जो उस आईडी के माध्य और var के साथ आईडी का एक स्तंभ है। स्पष्टीकरण में मदद के लिए धन्यवाद। – bw4sz

उत्तर

4

यह हूँ प्राप्त करने के लिए आप क्या चाहते हैं (मैं data नहीं नीचे की रीसाइक्लिंग उपयोग कर रहा हूँ पहले भाग में c(data, data) टाइप करने के लिए) एक छोटे से अपने डेटा को पुनर्व्यवस्थित करने के लिए सबसे आसान हो:

dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1] 
# V1 MEAN 
#1: 1 2.5 
#2: 2 4.0 
#3: 3 4.5 
संबंधित मुद्दे