以前からのいくつかの素晴らしいアドバイス に従って、私は今、2番目のR関数を書いて、同様のロジックを使用しています。しかし、私はもう少し自動化を試みており、自分の利益のためにあまりにも賢くなっているかもしれません。
注文数に基づいてクライアントを五分位に分割したい。これを行うための私のコードは次のとおりです。
_# sample data
clientID <- round(runif(200,min=2000, max=3000),0)
orders <- round(runif(200,min=1, max=50),0)
df <- df <- data.frame(cbind(clientID,orders))
#function to break them into quintiles
ApplyQuintiles <- function(x) {
cut(x, breaks=c(quantile(df$orders, probs = seq(0, 1, by = 0.20))),
labels=c("0-20","20-40","40-60","60-80","80-100"))
}
#Add the quintile to the dataframe
df$Quintile <- sapply(df$orders, ApplyQuintiles)
_
table(df$Quintile)
_0-20 20-40 40-60 60-80 80-100
40 39 44 38 36
_
サンプルデータで200個の観測値を作成しましたが、table
を介してリストされているのは197個だけです。残り3つはNA
です
現在、五分位の「NA」を持ついくつかのclientIDがあります。それらが最低休憩、この場合は1であった場合、カット関数に含まれていなかったようです。
すべての観測を含むcut
を作成する方法はありますか?
以下を試してください:
set.seed(700)
clientID <- round(runif(200,min=2000, max=3000),0)
orders <- round(runif(200,min=1, max=50),0)
df <- df <- data.frame(cbind(clientID,orders))
ApplyQuintiles <- function(x) {
cut(x, breaks=c(quantile(df$orders, probs = seq(0, 1, by = 0.20))),
labels=c("0-20","20-40","40-60","60-80","80-100"), include.lowest=TRUE)
}
df$Quintile <- sapply(df$orders, ApplyQuintiles)
table(df$Quintile)
0-20 20-40 40-60 60-80 80-100
40 41 39 40 40
include.lowest=TRUE
カット関数で、機能するようです。見る ?cut
詳細については。
由緒あるHmiscパッケージには cut2 もあります。分位カットを行います。
ヘルプから:
カットのような機能ですが、左端点は包括的で、ラベルは[下、上)の形式です。ただし、最後の間隔は[下、上]です。カットが指定されている場合、デフォルトでは、カットにxの範囲全体が含まれるようにします。また、カットが指定されていない場合、xを分位グループ(gが指定)または指定された最小観測数(m)のグループにカットします。 cutはカテゴリオブジェクトを作成しますが、cut2は因子オブジェクトを作成します。
データに同様の関数を使用していますが、5分位のビンの観測数が異なるため心配しています。ありがとう!
jobs02.vq <- cut(meaneduc02v, breaks=c(quantile(meaneduc02v, probs = seq(0, 1, by=0.20),
na.rm=TRUE, names=TRUE, include.lowest=TRUE, right = TRUE,
labels=c("1","2","3","4","5")))) # makes quintiles
そして、私が得る出力は次のとおりです。
table(jobs02.vq, useNA='ifany')
jobs02.vq
[1.00,2.00) [2.00,2.51) [2.51,3.34) [3.34,4.45) [4.45,5.33] <NA>
82 54 69 64 67 123
OneRパッケージ のcontent
関数のbin
メソッドを使用すると、これを非常に簡単に自動的に実行できます。
library(OneR)
set.seed(700)
clientID <- round(runif(200, min = 2000, max = 3000), 0)
orders <- round(runif(200, min = 1, max = 50), 0)
df <- data.frame(cbind(clientID, orders))
df$Quintiles <- bin(df$orders, method = "content")
table(df$Quintile)
##
## (0.952,9.8] (9.8,19] (19,31.4] (31.4,38.2] (38.2,49]
## 40 41 39 40 40
(完全開示:私はこのパッケージの著者です)