2015-07-31 10 views
5

मेरे पास 130,20 9 पंक्तियों में से data.frame है।मैं पंक्ति के आधार पर डेटाफ्रेम को पंक्ति के रूप में कैसे विभाजित करता हूं, एक फ़ंक्शन लागू करता हूं और गठबंधन करता हूं?

> head(dt) 

       mLow1 mHigh1 mLow2 mHigh2 meanLow meanHigh  fc  mean 
    A_00001 37.00 12.75 99.25 78.50 68.125 45.625 1.4931507 56.8750 
    A_00002 31.00 21.50 84.75 53.00 57.875 37.250 1.5536913 47.5625 
    A_00003 72.50 26.50 81.75 74.75 77.125 50.625 1.5234568 63.8750 

मैं 12 में data.frame विभाजित है, स्तंभ fc पर scale समारोह लागू करते हैं और फिर इसे संयोजित करना चाहते हैं। यहां कोई समूहीकरण चर नहीं है, अन्यथा मैंने ddply का उपयोग किया होगा। इसके अलावा, क्योंकि 130,20 9 12 तक पूरी तरह से विभाजित नहीं है, परिणामी data.frames असंतुलित होगा, यानी, 11 data.frame के पास 10,851 पंक्तियां होंगी और आखिरी में 10,848 पंक्तियां होंगी, लेकिन यह ठीक है।

तो मैं data.frame को एन के भाग में इस पंक्ति में कैसे विभाजित करूं (इस मामले में 12), एक फ़ंक्शन लागू करें और फिर उन्हें एक साथ जोड़ दें? किसी भी मदद की सराहना की जाएगी।

अद्यतन: दो शीर्ष समाधान का उपयोग करना, मैं अलग परिणाम प्राप्त: @Ben Bolker के समाधान का उपयोग करना,

mLow1 mHigh1 mLow2 mHigh2   UID  gene_id meanLow meanHigh mean   fc 
    1.5 3.25  1 1.25 MGLibB_00021 0610010K14Rik 1.25  2.25 1.75 -0.5231249 
    1.5 3.25  1 1.25 MGLibA_00034 0610037L13Rik 1.25  2.25 1.75 -0.5231249 
    1.5 3.25  1 1.25 MGLibB_00058 1100001G20Rik 1.25  2.25 1.75 -0.5231249 
    1.5 3.25  1 1.25 MGLibA_00061 1110001A16Rik 1.25  2.25 1.75 -0.5231249 
    1.5 3.25  1 1.25 MGLibA_00104 1110034G24Rik 1.25  2.25 1.75 -0.5231249 
    1.5 3.25  1 1.25 MGLibA_00110 1110038F14Rik 1.25  2.25 1.75 -0.5231249 

@ MichaelChirico के जवाब का उपयोग करना:

mLow1 mHigh1 mLow2 mHigh2   UID  gene_id meanLow meanHigh mean  fc fc_scaled 
    1.5 3.25  1 1.25 MGLibB_00021 0610010K14Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
    1.5 3.25  1 1.25 MGLibA_00034 0610037L13Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
    1.5 3.25  1 1.25 MGLibB_00058 1100001G20Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
    1.5 3.25  1 1.25 MGLibA_00061 1110001A16Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
    1.5 3.25  1 1.25 MGLibA_00104 1110034G24Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
    1.5 3.25  1 1.25 MGLibA_00110 1110038F14Rik 1.25  2.25 1.75 0.5555556 -0.5089608 
+0

इस पंक्ति की संख्या बड़ी नहीं है। आप अलग-अलग पैमाने पर संचालन क्यों करना चाहते हैं और एफसी कॉलम को सीधे स्केल करने के बजाय परिणामों को गठबंधन करना चाहते हैं ?? –

+0

मैं प्रचुर मात्रा में (माध्य) के लिए एफसी (गुना परिवर्तन) को नियंत्रित करना चाहता हूं। डेटा को मेरे वास्तविक डेटाफ्रेम में सॉर्ट किया गया है। मैं सामान्य बहुतायत के अलग-अलग हिस्सों के लिए अलग-अलग ज़्सकोर की गणना करना चाहता हूं (वास्तव में कम, निम्न ... मेड ... उच्च ... बहुत अधिक) –

+0

'कट (1: nrow (dt), 12) 'का उपयोग क्यों न करें विभाजित करें? –

उत्तर

4

ggplot2 एक cut_number() है सुविधा समारोह जो आपके लिए यह करेगा। यदि आप उस पैकेज को लोड करने के ऊपरी हिस्से को नहीं चाहते हैं, तो आप आवश्यक तर्क के लिए ggplot2:::breaks देख सकते हैं।

प्रतिलिपि प्रस्तुत करने योग्य उदाहरण @MichaelChirico से चोरी:

set.seed(100) 
KK<-130209L; nn<-12L 
library("dplyr") 
dt <- data.frame(mLow1=rnorm(KK),mHigh1=rnorm(KK), 
       mLow2=rnorm(KK),mHigh2=rnorm(KK), 
       meanLow=rnorm(KK),meanHigh=rnorm(KK), 
       fc=rnorm(KK),mean=rnorm(KK)) %>% arrange(mean) 

जो लोग पाइप पसंद नहीं है के लिए क्षमा याचना के साथ:

library("ggplot2") ## for cut_number() 
dt %>% mutate(grp=cut_number(mean,12)) %>% 
     group_by(grp) %>% 
     mutate(fc=c(scale(fc))) %>% 
     ungroup() %>%   
     select(-grp) %>%  ## drop grouping variable 
     as.data.frame -> dt2 ## convert back to data frame, assign result 

ऐसा लगता है कि c() आसपास scale() आवश्यक है - अन्यथा fc परिवर्तनीय कुछ विशेषताओं के साथ समाप्त होता है जो tail() को भ्रमित करते हैं ...

plyr, या बेस आर स्प्लिट-लागू-गठबंधन का उपयोग करने के लिए एक ही तर्क लागू होना चाहिए, साथ ही (समूह समूह चर को परिभाषित करने के लिए cut_number() का उपयोग कर रहा है)।

+0

मुझे खेद है कि मैं काफी उपयोग नहीं करता हूं। मुझे कक्षा '[1] "grouped_df" "tbl_df" "tbl" "data.frame" का ऑब्जेक्ट मिल रहा है। मैं इसे डेटा.फ्रेम में कैसे प्राप्त करूं? मैं डेटा नहीं देख सकता और उस पर 'as.data.frame' नहीं कर सकता। –

+0

मैंने अंत में%>% as.data.frame() का उपयोग किया और यह काम करता है। धन्यवाद। –

+0

वास्तव में मैं डेटा के नीचे तक पहुंच भी नहीं सकता। जब मैं पूंछ() का उपयोग करता हूं तो यह मुझे 'त्रुटि में त्रुटि देता है (एक्स [[i]], ...): dims [product 10899] ऑब्जेक्ट की लंबाई से मेल नहीं खाता [13020 9] ' –

2

data.table के साथ, आप कर सकते हैं:

library(data.table) 
setDT(dt)[,scale(fc),by=rep(1:nn,each=ceiling(KK/nn),length.out=KK)] 

यहाँ, KK 130,209 है और nn 12. प्रतिलिपि प्रस्तुत करने योग्य डेटा है:

set.seed(100) 
KK<-130209L; nn<-12L 
dt<-data.frame(mLow1=rnorm(KK),mHigh1=rnorm(KK), 
       mLow2=rnorm(KK),mHigh2=rnorm(KK), 
       meanLow=rnorm(KK),meanHigh=rnorm(KK), 
       fc=rnorm(KK),mean=rnorm(KK)) 

तो डेटा विभाजित है और पुनः संयोजित करने की कोई जरूरत।

आप के बजाय बस इसे निकालने के डेटा फ्रेम को यह जोड़ना चाहते हैं, तो आप संदर्भ द्वारा आवंटित करने के लिए := ऑपरेटर का उपयोग कर सकते हैं:

setDT(dt)[,fc_scaled:=scale(fc)...] 
+0

मैं 100 नहीं हूँ % यकीन है कि यह डेटा को सही तरीके से विभाजित करता है; मुझे लगता है कि आपको कुछ चाहिए जैसे 'rep (1: nn, प्रत्येक = छत (केके/एनएन), length.out = केके) '? –

+0

@ बेनबॉल्कर निश्चित, धन्यवाद। – MichaelChirico

+0

@MichaelChirico मुझे आपके समाधान और ऊपर दिए गए एक का उपयोग करके अलग-अलग परिणाम मिल रहे हैं। –

4

मुझे यकीन है कि dt मामलों की संरचना नहीं कर रहा हूँ इतना अधिक (यदि आप विभाजन करने के लिए अपने आंतरिक मूल्यों का उपयोग नहीं कर रहे हैं)। क्या यह मदद करता है?

spl.dt <- split(dt , cut(1:nrow(dt), 12)) 

lapply(spl.dt, my_fun) 
+0

धन्यवाद! मैंने आपके समाधान की कोशिश की, डेटा को लौटने के लिए 'lapply'' ldply' में बदल दिया। फ्रेम और यह काम करता है। –

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

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