2017-05-11 3 views
0

私は多くの行といくつかの列を持つdata.frameを持っています。私はそれらをグループ化して、今ではそのグループの2つの列に対して第1四分位未満の値を持つべき特定のグループの行を選択したいと思います。データ以下 :Rの2つの列に対して1より小さい値を持つ特定のグループのデータフレーム内の行をフィルタリングする方法は?

df: 


ID SD_1  SD_2  clust 
4 1.613479812 2.231100475 1 
6 2.348970134 4.509710677 1 
7 676.6791703 855.1300148 1 
8 5.702718972 9.789694982 1 
17 0.69905969 1.736578132 1 
18 45.94251574 32.40374486 2 
20 6.655940714 6.602647859 2 
21 0.367147263 0.447369751 2 
22 4.316702479 6.618716644 2 
25 7.481365283 7.955022446 2 
32 14.916817 71.70158686 2 
33 0.311656121 0.947110959 2 
34 0.555539595 0.438893998 2 
36 2.754111181 5.586499991 2 
42 8.718620333 12.50393499 3 
2 17.04906625 7.825923801 3 
3 9.337794688 2.805759945 3 
9 3.028141567 4.965291633 3 
39 0.770520551 0.676955176 3 
55 8.765592871 6.058640263 3 
67 0.863034955 1.150017033 3 

上記は私が各CLUST値の列に行をサブセットdf$SD_1df$SD2の第一四分位数に等しい未満の値でそれらとサブセットの行をGROUPBYする必要があるデータの一種です。

Rには機能がありますか、それを行うパッケージはありますか?私はtapply()を使用して、それらをクラスタ列でグループ化して行の第1四分位点を見つけましたが、df $ SD1およびdf $ SD2の第1四分位以下の各クラスタ値に対してこれらの行をフィルタリングします。私はRに1つのライナーがあると確信していますが、それを達成することはできません。 それはどのように私はdata.tableでR.

答えて

1

でそれを達成する必要があり、その後ワンライナーではない場合でも、あなたはこのような何か行うことができます。

require(data.table) 
setDT(df) 
df_sub <- df[, c("QSD_1", "QSD_2") := lapply(.SD, quantile, probs = .25), 
    by = group, .SDcols = c("SD_1", "SD_2")][SD_1 <= QSD_1 & SD_2 <= QSD_2] 
+0

は、それが働いたクール。私はddply()でしようとしていたが、ハードコーディングしていた。これは完璧なものです。ありがとう –

関連する問題