2009-08-11 10 views
8

यहाँ मैं इंगित करते हैं कि MyData के ऊपर या नीचे अपने मंझलाकैसे आर में कारक स्तर के भीतर मंझला विभाजन करना है?

### MedianSplits based on Whole Data 
#create some test data 
myDataFrame=data.frame(myData=runif(15),myFactor=rep(c("A","B","C"),5)) 

#create column showing median split 
myBreaks= quantile(myDataFrame$myData,c(0,.5,1)) 
myDataFrame$MedianSplitWholeData = cut(
    myDataFrame$myData, 
    breaks=myBreaks, 
    include.lowest=TRUE, 
    labels=c("Below","Above")) 

#Check if it's correct 
myDataFrame$AboveWholeMedian = myDataFrame$myData > median(myDataFrame$myData) 
myDataFrame 

वर्क्स ठीक है एक नया स्तंभ बनाते हैं। अब मैं एक ही बात करते हैं, लेकिन myFactor के प्रत्येक स्तर के भीतर मंझला विभाजन की गणना करना चाहते हैं।

मैं इस के साथ आ गया है:

#Median splits within factor levels 
byOutput=by(myDataFrame$myData,myDataFrame$myFactor, function (x) { 
    myBreaks= quantile(x,c(0,.5,1)) 
    MedianSplitByGroup=cut(x, 
     breaks=myBreaks, 
     include.lowest=TRUE, 
     labels=c("Below","Above")) 
    MedianSplitByGroup 
    }) 

byOutput शामिल मैं क्या चाहते हैं। यह ए, बी, और सी कारकों के प्रत्येक तत्व को सही ढंग से वर्गीकृत करता है। हालांकि मैं एक नया स्तंभ, myDataFrame $ FactorLevelMedianSplit बनाना चाहते हैं, कि नव अभिकलन मंझला विभाजन को दर्शाता है।

आप कैसे एक उपयोगी डेटा फ्रेम स्तंभ में "द्वारा" कमांड के उत्पादन में परिवर्तित? कैसे कारक (उपयोग करने के लिए की थियरी के उदाहरण के साथ

) चतुराई से, और पर:

मैं शायद "द्वारा" कमांड आर की तरह यह करने के लिए जिस तरह से ...

अद्यतन नहीं है लगता है स्पेक्टर की पुस्तक में "एवेन्यू" समारोह की खोज, मैं इस समाधान है, जो बिना किसी अतिरिक्त संकुल की आवश्यकता है पाया है।

myDataFrame$MediansByFactor=ave(
    myDataFrame$myData, 
    myDataFrame$myFactor, 
    FUN=median) 

myDataFrame$FactorLevelMedianSplit = factor(
    myDataFrame$myData>myDataFrame$MediansByFactor, 
    levels = c(TRUE, FALSE), 
    labels = c("Above", "Below")) 
+0

इसके लिए बेकार समाधान सुंदर है - धन्यवाद! – Amyunimus

उत्तर

3

यहाँ plyr पैकेज का उपयोग एक समाधान है।

myDataFrame <- data.frame(myData=runif(15),myFactor=rep(c("A","B","C"),5)) 
library(plyr) 
ddply(myDataFrame, "myFactor", function(x){ 
    x$Median <- median(x$myData) 
    x$FactorLevelMedianSplit <- factor(x$myData <= x$Median, levels = c(TRUE, FALSE), labels = c("Below", "Above")) 
    x 
}) 
+0

यह बहुत अच्छा काम किया। एक बेकार तरीके से पोस्ट के लिए अद्यतन भी देखें। –

1

यहां एक हैक-इश तरीका है। हैडली कुछ और अधिक सुरुचिपूर्ण के साथ आ सकता है:

शुरू करने के लिए, हम सरल by उत्पादन श्रेणीबद्ध:

R> do.call(c,byOutput) 
A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5 
1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 

और क्या मायने रखती है कि हम कारक स्तर 1 और यहाँ 2 जो हम करने के लिए उपयोग कर सकते हैं पाने के लिए फिर से सूचकांक उन स्तरों के साथ एक नया पहलू:

R> myDataFrame$FactorLevelMedianSplit <- 
     as.factor(c("Below","Above")[do.call(c,byOutput)]) 
:

R> c("Below","Above")[do.call(c,byOutput)] 
[1] "Below" "Above" "Above" "Below" "Below" "Below" "Below" "Above" 
[8] "Below" "Above" "Below" "Above" "Below" "Below" "Above" 
R> as.factor(c("Below","Above")[do.call(c,byOutput)]) 
[1] Below Above Above Below Below Below Below Above Below Above 
[11] Below Above Below Below Above 
Levels: Above Below 

जो हम तो data.frame में प्रदान कर सकते हैं आप संशोधित करना चाहते थे

अद्यतन: कोई बात नहीं, हम पुन: अनुक्रमणिका को myDataFrame एक एक ... एक बी ... बी सी अनुसार क्रमबद्ध करने की आवश्यकता होगी ... सी के साथ-साथ इससे पहले कि हम नया स्तंभ जोड़ने। एक अभ्यास के रूप में छोड़ दिया ...

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