2009-08-11 22 views
8

Ben myData onun medyanR'de faktör düzeyleri içinde medyan bölünmeler nasıl yapılır? İşte

### 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 

İşleri cezası altında veya üstünde olup olmadığını göstermek için yeni bir sütun olun. Şimdi aynı şeyi yapmak istiyorum, ancak myFactor'un her seviyesindeki medyan bölünmeleri hesaplamak istiyorum.

Ben bu ile geldim:

#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 ne istiyorum içerir. A, B ve C faktörlerinin her bir öğesini doğru olarak sınıflandırır. Ancak, yeni hesaplanmış medyan bölünmeyi gösteren yeni bir sütun, myDataFrame $ FactorLevelMedianSplit oluşturmak istiyorum.

"By" komutunun çıktısını yararlı bir veri çerçevesi sütununa nasıl dönüştürüyorsunuz? faktörünü (nasıl kullanılacağına ilişkin Thierry'nin örnek ile

) akıllıca ve üzerine:

belki komut R benzeri Bunu yapmanın yolu ...

Güncelleme değil "tarafından" düşünmek Spector'un kitabındaki "ave" işlevini keşfetmek, ek bir paket gerektirmeyen bu çözümü buldum.

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

Bu pakete uygun çözüm güzel - teşekkürler! – Amyunimus

cevap

3

İşte plyr paketi kullanarak bir çözüm.

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

Bu harika çalıştı. Paketleme yolu için yayına yapılan güncellemeye de bakın. –

1

İşte hack-ish yoludur. Hadley daha şık bir şey ile gelebilir:

başlatmak için, basit by çıkışını bitiştirmek:

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 

ve ne biz için kullanabileceğiniz faktör seviyelerini 1 ve burada 2 almak yeniden endeksi önemli bu seviyede yeni bir faktörü:

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 

biz sonra data.frame içine atayabilirsiniz değiştirmek istedi

Güncelleştirme: Unutmayın, yeni bir sütun eklemeden önce AData ... A B ... B C ... C'ye dönüştürülecek myDataFrame'ini reindex'e ihtiyacımız var. Bir egzersiz olarak bıraktı ...