ここで、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 には、私が欲しいものが含まれています。因子 A、B、および C の各要素を正しく分類します。ただし、新しく計算された中央分割を示す新しい列 myDataFrame$FactorLevelMedianSplit を作成したいと思います。
「by」コマンドの出力を有用なデータフレーム列に変換するにはどうすればよいですか?
おそらく「by」コマンドは、これを行うRのような方法ではないと思います...
更新:
factor() を巧みに使用する方法のティエリーの例と、スペクターの本で「ave」関数を発見したとき、追加のパッケージを必要としないこのソリューションを見つけました。
myDataFrame$MediansByFactor=ave(
myDataFrame$myData,
myDataFrame$myFactor,
FUN=median)
myDataFrame$FactorLevelMedianSplit = factor(
myDataFrame$myData>myDataFrame$MediansByFactor,
levels = c(TRUE, FALSE),
labels = c("Above", "Below"))