2017-06-26 6 views
0

一般に、1つの列の分布のデータフレームの上位5分の1を取得します。ただし、別の列のすべての一意のカテゴリ値の上位5分の1になる必要があります。いくつかのカテゴリ値の上位5分位

私はそれがいくつかのステップで、潜在的にループで行われなければならないと思います。最初は、固有のカテゴリ値に基づいてデータフレームを分離し、次にすべての新しいデータフレームの上位5分の1を保持し、最後にデータフレームを最後に再度バインドする必要があります。 しかし、私はこれを行う方法はわかりません。

いくつかのサンプルデータ:ステップ1では

dat <- data.frame(x = rep(letters[1:3],times = 5), 
        y = rep(1:3,each = 5)) 
    > dat 
    x y 
1 a 1 
2 b 1 
3 c 1 
4 a 1 
5 b 1 
6 c 2 
7 a 2 
8 b 2 
9 c 2 
10 a 2 
11 b 3 
12 c 3 
13 a 3 
14 b 3 
15 c 3 

私はすべてのユニークなカテゴリ値のデータフレームを作成したいです。何かのように:それに応じ

df.bとdf.c

> df.a 
    x y 
    1 a 1 
    2 a 1 
    3 a 2 
    4 a 2 
    5 a 3 
第2段階で、私はすべての新しいデータフレームのトップ五分位を維持したいです。ような何か:

このなった場合:最後のステップで

> df.a=df.a[df.a$y > quantile(df.a, 0.5, na.rm = TRUE),] 
    # taking the top 50% because the top quintile would not work with the sample data. 

、私はすべての新しいデータフレームをrbindする必要があります。

答えて

1

あなたのサンプルデータでは5分音符を使用しにくいので、サンプルデータを少し変更します。

## New data 
dat <- data.frame(x = rep(letters[1:3],times = 25), 
        y = sample(10, 75, replace=TRUE)) 

五分位数を取得するためには、カテゴリ変数の値ごとに別々のdata.framesを作成する必要はありません。 aggregateでそれを行うことができます。カテゴリ別に(トップ)五分位数のテーブルを持つ今

Limits = aggregate(dat$y, list(dat$x), quantile, 0.8) 
row.names(Limits) = Limits[,1] 
(Limits = Limits [,-1, drop=FALSE]) 
    x 
a 8.0 
b 7.2 
c 8.0 

、私たちはそれらの五分位数(カテゴリー別)の上にある元のデータの一部を選択することができます。

TopQuintile = dat[which(dat$y >= Limits[dat$x,1]), ] 
関連する問題