27

以前からの素晴らしいアドバイスに従って、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 の観測を作成しましたが、197 のみが を介してリストされていることがわかりますtable。残った3つはNA

現在、クインタイルの「NA」を持つ clientID がいくつかあります。それらが最小のブレーク (この場合は 1) にあった場合、それらはカット関数に含まれていないようです。

cutすべての観察結果 を含める方法はありますか?

4

7 に答える 7

29

次のことを試してください。

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してください。

于 2012-07-30T19:49:06.113 に答える
7

由緒ある Hmisc パッケージにもcut2があります。分位カットを行います。

ヘルプから:

カットのように機能しますが、左端点は包括的であり、ラベルは [lower, upper) の形式です。ただし、最後の間隔は [lower,upper] です。カットが指定されている場合、デフォルトで、カットが x の全範囲を含むようにします。また、cuts が指定されていない場合は、x を分位グループ (g が指定されている) または指定された最小観測数 (m) のグループにカットされます。cut はカテゴリ オブジェクトを作成しますが、cut2 は factor オブジェクトを作成します。

于 2015-01-21T19:49:40.107 に答える
5

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

(完全な開示: 私はこのパッケージの作成者です)

于 2016-08-13T11:18:11.697 に答える
2

私は自分のデータに同様の関数を使用していますが、私の五分位ビンの観測数が異なるため心配です:それでよろしいですか? ありがとう!

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 
于 2015-11-13T22:49:36.650 に答える