2016-09-04 6 views
0

他のダグサブセット設定の申し訳ありません。私はちょうど共通する必要がありますが、説明されたこのケースを見つけることができません。煮ダウンデータは次のようになります - 以上、3つのすべてのA行のR:1つの一致する観測値を持つ個体のすべての観測値をサブセット化する

Plot  Year BA 
A  1980 44 
A  1990 54 
A  2000 66 
B  1980 58 
B  1990 69 
B  2000 80 

私は1980年のBA < 50とのいずれかのプロットのすべての観測をしたいです。私はsubset(Df, BA<50 & Year==1980)を理解していますが、次のレベルの索引付けを理解することはできません。

誰かがフレーズの方が良い方法を持っていれば、私はそれを変更します。私が考えることができるすべての方法は、オンになって検索するだけです&/|質問。 (非常に多くの&/|質問...)

答えて

1

インデックスあなたの状態Plot上、実際のデータでの条件を満足する複数のPlotがある場合には%in%とメンバーシップを確認します。 dplyr

subset(df, Plot %in% unique(Plot[BA < 50 & Year == 1980])) 
# Plot Year BA 
# 1 A 1980 44 
# 2 A 1990 54 
# 3 A 2000 66 

または標準評価[サブセットと、

df[with(df, Plot %in% unique(Plot[BA < 50 & Year == 1980])), ] 
# Plot Year BA 
# 1 A 1980 44 
# 2 A 1990 54 
# 3 A 2000 66 
+0

*プロット%を使用することができます!私はあなたの最初の例をその重要なビットを除いて試しました。サブセット()と[]の両方を与えてくれてありがとうございました - サブセットの危険性を議論したこともありました。 @Psidom私はそのdplyr構文がうまくいくのが好きですが、それは*の後のものです*私は通常の索引付けの周りに頭を上げます。 – uhClem

+0

@uhClem - 同じグループに2つ以上のマッチがあるときに効率的になると思う「ユニーク」を追加して編集しました。 –

1

別のオプションは、これはそうでなければ、all()と条件をラップする場合があり、各プロットのための1980に等しい1つのレコードのみがあると仮定しまたはany()を入力します。

library(dplyr) 
df %>% group_by(Plot) %>% filter(BA[Year == 1980] < 50) 

# Source: local data frame [3 x 3] 
# Groups: Plot [1] 

#  Plot Year BA 
# <fctr> <int> <int> 
# 1  A 1980 44 
# 2  A 1990 54 
# 3  A 2000 66 

le 1980はいくつかのプロットに対して存在し、@ DirtySockSnifferの答えによる論理はdf %>% group_by(Plot) %>% filter(any(BA[Year == 1980] < 50))と等価であり、dplyrにあります。

1

我々は*%にdata.table

library(data.table) 
setDT(df1)[, if(all(BA[Year == 1980] < 50)) .SD, by = Plot] 
# Plot Year BA 
#1: A 1980 44 
#2: A 1990 54 
#3: A 2000 66 
関連する問題