val
以下で作成されたデータ値に似た変数を使用しています。
# data --------------------------------------------------------------------
data("mtcars")
val <- c(mtcars$wt, 10.55)
この変数を次の方法でカットしています。
# Cuts --------------------------------------------------------------------
cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val)
res <- cut2(x = val, cuts = cut_breaks)
これにより、次の結果が生成されます。
> table(res)
res
[ 1, 2) [ 2, 3) [ 3, 4) [ 4, 5) [ 5, 6) 6 7 8 9 [10,11]
4 8 16 1 3 0 0 0 0 1
作成された出力で、次を変更したいと思います。
- 1 つの値を持つグループを作成することに興味はありません。理想的には、各グループが少なくとも 3/4 の値を持つようにしたいと考えています。逆説的に、値が 0 のグループを残すことができます。これは、後で実際のデータをマージするときに削除されるためです。
- 切断メカニズムへの変更は、整数値を持つ変数で作業する必要があります
- カットはきれいでなければなりません。1.23 - 2.35 のようなものを避けようとしています。それらの値が分布を考えると最も賢明であるとしても.
- 事実上、私が達成しようとしているのはこれです:多かれ少なかれきれいなグループを作るようにしてください。本当に小さなグループを取得してから次のグループと一緒にぶつけても、空のグループについて心配する必要はありません。
完全なコード
便宜上、完全なコードを以下に示します。
# Libs --------------------------------------------------------------------
Vectorize(require)(package = c("scales", "Hmisc"),
character.only = TRUE)
# data --------------------------------------------------------------------
data("mtcars") val <- c(mtcars$wt, 10.55)
# Cuts --------------------------------------------------------------------
cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val) res <-
cut2(x = val, cuts = cut_breaks)
私が試したこと
最初のアプローチ
私はコードeps.correct = 0
のような値で遊んでみました:pretty_breaks
cut_breaks <- pretty_breaks(n = cuts, eps.correct = 0)(variable)
しかし、どの値も近いところに私を連れて行ってくれません
2 番目のアプローチ
m= 5
関数で引数を使用してみましcut2
たが、同じ結果に達し続けています。
コメント返信
私の休憩機能
関数を試してみましたmybreaks
が、より多くの奇妙な変数を適切にカットするには、いくつかの作業を行う必要があります。大まかに言えば、pretty_breaks
私にとってはうまくいきますが、時々発生する小さなグループは望ましくありません。
> set.seed(1); require(scales)
> mybreaks <- function(x, n, r=0) {
+ unique(round(quantile(x, seq(0, 1, length=n+1)), r))
+ }
> x <- runif(n = 100)
> pretty_breaks(n = 5)(x)
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> mybreaks(x = x, n = 5)
[1] 0 1