按年份采样完整性筛选data.frame中的站点数据
筛选每年均有采样记录的地点数据
我明白你遇到的问题了——手里有个记录地点、年份和物种数量的data.frame,但不是所有地点每年都有采样数据,你只想保留那些每年都有采样记录的地点对应的所有数据,之前试了aggregate和subset都没搞定对吧?
下面是可行的解决方案,分两步走:
步骤1:为每个地点标记采样频次
首先用transform()函数给你的数据框新增一列,统计每个地点总共出现了多少次(也就是有多少条采样记录):
df <- transform(df, freq.loc = ave(seq(nrow(df)), location, FUN=length))
这里的ave()函数会按照location分组,对每行的序号序列计算长度,本质就是统计每个地点的采样次数。
步骤2:筛选出每年都有采样的地点
接下来先确定你的数据里总共有多少个不同的年份:
total_years <- length(unique(df$year))
然后筛选出freq.loc等于总年份数的行——因为只有采样次数等于总年份数的地点,才是每年都有记录的:
filtered_df <- subset(df, freq.loc == total_years)
这样得到的filtered_df就是你想要的结果,只包含那些每年都有采样的地点、对应年份和物种数。
举个简单的示例验证一下:
假设你的原始数据是这样的:
df <- data.frame( location = c(1,1,2,3,3,3), year = c(2020,2021,2020,2020,2021,2022), species_count = c(5,7,3,4,6,8) )
运行步骤1后,df会新增freq.loc列:location1的频次是2,location2是1,location3是3;而总年份数是3,所以步骤2筛选后,只会保留location3的所有行。
内容的提问来源于stack exchange,提问作者Arjen Boon
相关产品推荐
相关产品推荐

