2016-04-18 5 views
0

私は1つの列名「サイト」と別の名前の「年」があるかどうか疑問に思っていましたが、どのようにして最低4年のサイトしか選択できませんでしたか?他の場所で同様の質問が表示されています(たとえばHow To Filter a Dataframe based on Category Counts)が、別の列に基づいてそのようなフィルタを選択する方法はわかりません。例示的なデータセット:特定の要因のカウントに基づいて行をフィルタリングする

Site <- as.data.frame(as.factor(rep(c("Site.A","Site.B","Site.C"), each =4))) 
Year <- as.data.frame(as.numeric(c(2010,2011,2012,2013,2010,2011,2012,2013, 
           2010,2010,2010,2010))) 
Count <- as.data.frame(matrix(sample(0:10, 3*4, replace=TRUE), ncol=1)) 

df <- cbind(Site,Year,Count) 
colnames(df) <- c("site","year","count") 

e.e.e. 1年間のデータしかないため、サイトCはこのデータセットから削除されます。

答えて

2

、あなたは、この(あなたのデータは、このようなゼロのケースを持って注意してください)のような何かを行うことができます:

df %>% group_by(Site) %>% filter(n() >= 4) 

注、フィルタにn_distinct()は、大量のデータセット(dplyrのバグを知られている)上で非常に遅くすることができます。あなたはこの問題に遭遇した場合は、単にのようにのみlength(unique(Year))によってその部分を置き換える:

df %>% group_by(Site) %>% filter(length(unique(Year)) > = 4) 
+0

これは素晴らしいですありがとう! –

1

年間1サイトの観測がある場合は、tableを使用してみてくださいは:

# get names of site obs with counts >= 4 
keepers <- names(table(df$Site))[table(df$Site) >= 4] 
# keep these 
dfNew <- df[df$Site %in% keepers] 

年ごとに複数のサイトの観測がある場合は、線の上にキーパーに若干の調整を実行する必要があります。

# create table for readability 
yearSiteCount <- table(unique(df[,c("Site", "Year")])$Site) 
keepers <- names(yearSiteCount)[yearSiteCount >= 4] 

残りのコードは同じです。あなただけのデータでは5行でサイトをしたい場合は、あなたが行うことができ、また

library(dplyr) 

df %>% group_by(Site) %>% filter(n_distinct(Year) >= 4) 

:ライブラリdplyrを使用して

+0

ありがとうございます!私の実際のデータセットでは、1年に複数回の観測(つまり異なる季節)があります。 –

+0

@James White OK。それは修正可能です – lmo

3

ここdata.tableを使用してオプションがあります。 iflengthuniqueの 'year'の要素が3(uniqueN(year) >3)より大きい場合、 'data.frame'を 'data.table'(setDT(df))に変換し、Data.tableのサブセットを取得します.SD

setDT(df)[, if(uniqueN(year)>3) .SD , by = site] 
#  site year count 
#1: Site.A 2010  2 
#2: Site.A 2011  3 
#3: Site.A 2012  7 
#4: Site.A 2013  6 
#5: Site.B 2010  4 
#6: Site.B 2011  0 
#7: Site.B 2012  5 
#8: Site.B 2013  1 
関連する問題