2016-07-11 16 views
1

以下は、適切に行う方法について合理的に当惑しています。私はそれがおそらく単純だと知っていますが、私はそれを理解できません。dplyrを使用して最大値より前のすべての値をフィルタリングしてください

私は、水に吊り下げられた器具でデータを収集していると言います。データに無関係に、深度の読み取りが行われます。私はちょうどの方法でデータに興味があり、途中からすべてのデータをフィルタリングしたいとします。より明示的には、深度測定値の前に、の前に最も低い値のdepthをフィルタリングしたいと思います。小さなキャッチの1つは、しばしば、データに深い点まで続く前に、わずかに上がる2つの深度の値があることです。したがって、純粋な昇順/降順の問題ではありません。理想的にはdplyrアプローチ(またはdplyrとうまくいくもの)を使用します。なぜなら、データにグループがあるからです。ここではいくつかのダミーデータは次のとおりです。

library(dplyr) 

df1 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="x") 
df2 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="y") 
df <- rbind(df1, df2) 

私は簡単に最も深い価値を見つけることができる午前として立ち往生保つ:

df %>% mutate(depth==max(depth)) 

私も(マルクの答え@使用して)一つのグループのための深さを見つけることができます:

しかし
df %>% 
    filter(Group=="x") %>% 
    add_rownames() %>% 
    filter(rowname %in% c(seq(which.max(depth)))) 

、私は私はまだ最初のグループから望ましい結果を得るgroup_by文を追加してみてください:

df %>% 
    add_rownames() %>% 
    group_by(Group) %>% 
    filter(rowname %in% c(seq(which.max(depth)))) 

group_byはフィルタで動作するとは思っていませんでしたが、フィルタを使用しないでrownamesをサブする方法はわかりません。ここにどんなアイデア?

+0

@Psidom - Iは、上記に述べたように、それは私が一致する必要が昇順/降順パターンが厳密ではありません。 – boshek

+0

@ Marcの答えはあなたに必要なものを与えますか? – Psidom

+0

@Psidom正確ではありません。私は 'dplyr'のようなアプローチでこれをどのように適用するかを考えていません。 – boshek

答えて

1

は、問題のdplyr解決策を考え出すていないように見えますが、data.table代替作品:

library(data.table) 
setDT(df)[, head(.SD, which.max(depth)), by = Group] 
# say the factor is some grouping variable you are trying to apply 

    Group depth   x 
1:  x 1.0 -0.22907469 
2:  x 2.0 0.15284187 
3:  x 3.0 1.99289070 
4:  x 4.0 -0.80802497 
5:  x 5.0 0.41455226 
6:  x 6.0 0.39673474 
7:  x 5.0 -0.35179347 
8:  x 7.0 -0.18892176 
9:  x 8.0 2.97448709 
10:  x 9.0 -0.14464747 
11:  x 10.0 0.99434061 
12:  x 10.5 -0.64831649 
13:  y 1.0 1.10262757 
14:  y 2.0 -0.64630288 
15:  y 3.0 0.43909555 
16:  y 4.0 -0.00575027 
17:  y 5.0 -0.81374528 
18:  y 6.0 -0.45948930 
19:  y 5.0 0.03333462 
20:  y 7.0 0.31111807 
21:  y 8.0 1.64502251 
22:  y 9.0 0.97451275 
23:  y 10.0 1.12403518 
24:  y 10.5 1.21710311 
    Group depth   x 

dplyrにこだわって、あなたが作成することができます新しいid変数をグループごとに個別にラベル付けし、次にwhich.maxに基づいてフィルタリングする変数:

df %>% group_by(Group) %>% mutate(id = seq_len(n())) %>% filter(id <= which.max(depth)) 
+0

私は私の質問を改訂しました。私はあなたとMarcのおかげでもう少し近くになりましたが、私はまだそれほどありません。 – boshek

+1

答えに 'dplyr'ソリューションを追加しました。問題は、 'dplyr'を使って行の名前を追加すると、グループによって追加されないため、解決策が機能しないということです。グループごとに 'id'変数を個別に追加し、それに基づいてサブセットを追加することができます。 – Psidom

1

これは動作します:

df[seq(which.max(df$depth)),] 
3

別のアプローチ

library(dplyr) 
df %>% group_by(Group) %>% filter(between(row_number(),1,which.max(depth))) 
+0

良い答え。ここで 'row_number()'はグループ単位であるようです。 – Psidom

+0

+1この回答はうまくいきますが、ここのフィルタ関数はrow_numberで動作するため、データのソート方法が脆弱です。問題を回避する簡単な予防措置は、測定時間を示す変数(OPのダミーデータには含まれていない)でデータをソートすることです。 –

関連する問題