根据特定因子的计数过滤行

时间:2016-04-18 19:21:07

标签: r filter dataframe

我想知道我是否有一个列名称'site'而另一个名为'year',我怎么才选择至少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")

即。将从此数据集中删除站点C,因为只有1年的数据。

3 个答案:

答案 0 :(得分:3)

以下是使用data.table的选项。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),按&#39;网站&#39;,if lengthunique元素分组在&#39;年&#39;大于3(uniqueN(year) >3),我们得到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

答案 1 :(得分:2)

使用库dplyr,你可以这样做(注意你的数据没有这样的情况):

library(dplyr)

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

或者,如果您只想在数据中包含五行的网站,则可以执行以下操作:

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

注意,过滤器中的n_distinct()在海量数据集上可能非常慢(dplyr中的已知错误)。如果您遇到此问题,只需将length(unique(Year))替换为该部分,如下所示:

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

答案 2 :(得分: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]

其余代码是相同的。