如何用complete函数为每个站点分组填充自定义年份范围?
问题:按站点补全自身年份区间内的所有年度记录
我有一个包含不同站点及对应采样年份的dataframe,希望实现:每个站点在其最早采样年份至最晚采样年份之间的每一年都有一条记录(例如示例中的站点A需覆盖2007-2017年的每一年)。
示例数据代码:
set.seed(42) df <- data.frame(site = rep(LETTERS[1:3], each = 5), year = floor(runif(15, 2000, max = 2018))) %>% distinct() %>% arrange(site, year)
生成的数据如下:
site year 1 A 2007 2 A 2011 3 A 2014 4 A 2017 5 B 2001 6 B 2007 7 B 2008 8 B 2010 9 C 2004 10 C 2005 11 C 2011 12 C 2014 13 C 2017
我尝试使用complete(site, year),但结果中每个站点会包含所有可能的年份(例如站点A的年份范围变为2001-2017),请问如何解决该问题?
解决方案
要实现每个站点只补全自身年份区间内的连续记录,需要先按site分组,再在分组内生成该站点专属的年份序列,最后用complete补全:
library(tidyverse) df_complete <- df %>% group_by(site) %>% complete(year = seq(min(year), max(year), by = 1)) %>% ungroup()
代码说明:
group_by(site):按站点分组,确保后续操作仅针对每个站点自身的数据complete(year = seq(min(year), max(year), by = 1)):在每个分组内,生成从该站点最早年份到最晚年份的连续年度序列,并补全缺失的记录ungroup():取消分组,恢复普通dataframe结构
也可以用full_seq函数简化年份序列的生成,效果完全一致:
df_complete <- df %>% group_by(site) %>% complete(year = full_seq(year, period = 1)) %>% ungroup()
这样处理后,站点A会只包含2007-2017的所有年份,站点B包含2001-2010的所有年份,站点C包含2004-2017的所有年份,完全符合需求。
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

