2013-06-04 6 views
9
में एक दूसरे स्तंभ से प्रत्येक स्तंभ घटाएँ

चलो कहते हैं कि मैं एक data.tableएक आर data.table

set.seed(1) # to make the example reproducible 
ex<-data.table(AAA=runif(100000), 
       BBB=runif(100000), 
       CCC=runif(100000), 
       DDD=runif(100000), 
       FLAG=c(rep(c("a","b","c","d","e"),200000))) 

मैं, तो BBB हर शेष स्तंभ से स्तंभ AAA हर दूसरे स्तंभ से घटाना चाहते हैं (सिवाय करते हैं फ्लैग) और इतने पर इतना है कि उत्पादन की तरह दिखाई देगा ...

ex[,list(AAA_BBB=AAA-BBB, 
     AAA_CCC=AAA-CCC, 
     AAA_DDD=AAA-DDD, 
     BBB_CCC=BBB-CCC, 
     BBB_DDD=BBB-DDD, 
     CCC_DDD=CCC-DDD)] 

वहाँ एक data.table वाक्य रचना कि यह जानने के कितने कॉलम देखते हैं या उनके नाम क्या हैं बिना सफाई से कर सकते हैं?

+0

अपने उदाहरण में 1000000 पंक्तियों के साथ काम बहुत मजेदार नहीं है। आपके प्रश्न में दक्षता का उल्लेख नहीं किया गया था ... क्या यह चिंता का विषय है? वैसे भी, मैंने केवल दस पंक्तियों के साथ अपने जवाब की कोशिश की। – Frank

+1

@ फ्रैंक मुझे विश्वास है कि डेटाटेबल का उपयोग होने पर दक्षता की आवश्यकता बहुत अधिक है। – Roland

+0

@ फ्रैंक उदाहरण में अत्यधिक पंक्तियों के बारे में खेद है, मैंने पिछले प्रश्न की प्रतिलिपि बनाई है, मैंने पूछा कि बड़ी संख्या में पंक्तियां उदाहरण के लिए प्रासंगिक थीं। –

उत्तर

5

data.table भीतर संयोजन से अधिक लूपिंग:

comblist <- combn(names(ex)[-5],2,FUN=list) 
res2 <- ex[,lapply(comblist,function(x) get(x[1])-get(x[2]))] 

setnames(res2,names(res2),sapply(comblist,paste,collapse="_")) 
+0

क्या 'res2' में' FLAG' रखने का कोई तरीका है या क्या मुझे बाद में वापस जोड़ना है? मैंने 'सूची की कोशिश की (लापरवाही (संयोजन, फ़ंक्शन (एक्स) प्राप्त करें (x [1]) - प्राप्त करें (x [2])), फ्लैग)]' लेकिन यह काम नहीं किया। –

+0

आप 'ex [, sapply (comblist, paste, collapse = "_") का उपयोग कर सकते हैं: = lapply (comblist, function (x) प्राप्त करें (x [1]) - प्राप्त करें (x [2]))] और जोड़ें संदर्भ के आधार पर मूल डेटा.table के लिए नए कॉलम। – Roland

4

combn और apply के साथ एक समाधान:

cc <- combn(colnames(ex)[1:4], 2) 
apply(cc, 2, function(x)ex[[x[1]]]-ex[[x[2]]]) 

पहले 5 पंक्तियों के लिए देता है:

   [,1]   [,2]  [,3]  [,4]  [,5]   [,6] 
[1,] -0.43500930 -0.520148152 0.1602265 -0.08513885 0.59523580 0.680374655 
[2,] -0.32964090 -0.153303302 -0.3807295 0.17633760 -0.05108855 -0.227426149 
[3,] 0.25991705 -0.079679566 0.2040904 -0.33959662 -0.05582670 0.283769917 
[4,] 0.35585252 0.153083047 0.2382553 -0.20276948 -0.11759719 0.085172292 
[5,] -0.67081018 -0.116543468 -0.3413471 0.55426671 0.32946305 -0.224803663 

संपादित

के रूप में अरुण का सुझाव दिया, combn एक समारोह तर्क ले जा सकते हैं, तो एक बेहतर समाधान

res <- combn(colnames(ex)[1:4], 2, function(x) ex[[x[1]]] - ex[[x[2]]]) 
colnames(res) <- combn(colnames(ex)[1:4], 2, paste, collapse="_") 
as.data.table(res) 

      AAA_BBB  AAA_CCC  AAA_DDD  BBB_CCC  BBB_DDD  CCC_DDD 
     1: -0.4350093 -0.52014815 0.16022650 -0.08513885 0.59523580 0.68037465 
     2: -0.3296409 -0.15330330 -0.38072945 0.17633760 -0.05108855 -0.22742615 
     3: 0.2599171 -0.07967957 0.20409035 -0.33959662 -0.05582670 0.28376992 
     4: 0.3558525 0.15308305 0.23825534 -0.20276948 -0.11759719 0.08517229 
     5: -0.6708102 -0.11654347 -0.34134713 0.55426671 0.32946305 -0.22480366 
    ---                  
999996: -0.8450458 -0.47951267 -0.30333929 0.36553310 0.54170648 0.17617338 
999997: -0.5778393 -0.01784418 -0.24353237 0.55999516 0.33430697 -0.22568819 
999998: 0.7127352 0.82554276 0.01258673 0.11280758 -0.70014846 -0.81295604 
999999: -0.6693544 -0.42335069 -0.81080852 0.24600375 -0.14145408 -0.38745783 
1000000: -0.8511655 -0.23341818 -0.15830584 0.61774732 0.69285966 0.07511234 
+2

(+1) 'combn' में फ़ंक्शन तर्क भी है:' combn (colnames (ex) [1: 4], 2, फ़ंक्शन (x) ex [[x [1]]] - ex [[x [2 ]]]) ' – Arun

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