如何基于数据集最值生成全组合预测数据集(R语言)
生成站点-年份-质量全组合数据集的解决方案
需求说明
基于包含A、B两个站点的现有数据集,生成用于模型预测的新数据集,需包含每个站点对应的完整年份范围(从该站点年份最小值到最大值,含所有中间年份)、完整质量范围(从该站点质量最小值到最大值,以0.1为步长)的所有唯一组合。
示例数据集
# 示例数据集 df <- data.frame(site = c(rep("A", 20), # 站点A共20条观测 rep("B", 30)), # 站点B共30条观测 year = c(sample(1:5, 20, replace = TRUE), # 站点A年份范围1-5 sample(c(1:4, 6:7), 30, replace = TRUE)), # 站点B年份需覆盖1-7(含缺失的5) mass = c(sample(seq(2, 5, 0.1), 20, replace = TRUE), # 站点A质量范围2-5 sample(seq(1, 6, 0.1), 30, replace = TRUE))) # 站点B质量范围1-6
尝试过的方法及问题
使用
complete函数时,报错找不到mass对象:df %>% complete(year, nesting(site), fill = list(seq(min(mass), max(mass), 0.1))) # 错误信息:Error in seq(min(mass), max(mass), 0.1) : object 'mass' not found问题:
fill参数用于填充缺失值而非生成序列,且无法在complete的上下文中识别分组后的mass范围。使用
reframe函数时,无法覆盖完整质量范围:df %>% reframe(year = min(year):max(year), .by = c(site, mass))问题:按
site和mass分组后,仅能生成现有mass值对应的年份序列,无法生成完整的质量范围序列。
正确解决方案
通过分组计算每个站点的年份/质量完整序列,再展开所有组合即可实现需求:
library(tidyverse) # 按站点分组,提取每个站点的完整年份序列和质量序列 site_meta <- df %>% group_by(site) %>% summarise( # 生成站点的完整年份序列(含所有中间年份) year = list(min(year):max(year)), # 生成站点的完整质量序列(步长0.1) mass = list(seq(min(mass), max(mass), by = 0.1)) ) # 展开所有站点-年份-质量的组合 full_pred_dataset <- site_meta %>% unnest(year) %>% unnest(mass)
代码说明
- 第一步通过
group_by(site)分组,分别计算每个站点的年份范围(min(year):max(year))和质量范围(seq(min(mass), max(mass), by=0.1)),并将序列存储为列表列。 - 第二步用
unnest依次展开年份和质量的列表列,得到所有唯一组合。
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

