我想知道我是否有一个列名称'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年的数据。
答案 0 :(得分:3)
以下是使用data.table
的选项。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)
),按&#39;网站&#39;,if
length
个unique
元素分组在&#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]
其余代码是相同的。