基于另一数据框的海拔范围随机采样数据框的实现问题
基于Seed_zone匹配+Altitude±10范围的随机采样实现
问题背景
现有两个数据框:
- dfA:10万+行的气候数据,包含
Climate data、Altitude、Seed_zone字段 - dfB:约50行的采样条件列表,包含
Seed_zone、Altitude、freq字段
原已实现精确匹配Seed_zone和Altitude的采样逻辑,但因匹配结果数量不足,需调整为:按Seed_zone精确匹配,同时dfA.Altitude落在dfB.Altitude±10范围内,再按freq指定数量随机采样。
原可行精确匹配代码
sample <- dfA %>% inner_join(dfB) %>% group_by(Seed_zone, Altitude) %>% sample_n(first(freq))
无效代码问题分析
之前尝试的代码存在两处核心问题:
filter(dfA > dfB -10 & dfA < dfB +10)未指定具体字段,且跨数据框直接比较会引发维度不匹配错误- 仅按
Seed_zone分组,未关联dfB的单个采样条件,无法对应每个条件的freq采样数量
正确实现方案
代码实现
library(dplyr) sample_result <- dfA %>% # 按Seed_zone关联两个数据框,给重复字段加后缀区分 inner_join(dfB, by = "Seed_zone", suffix = c("_A", "_B")) %>% # 筛选Altitude在目标值±10范围内的记录 filter(Altitude_A >= Altitude_B - 10 & Altitude_A <= Altitude_B + 10) %>% # 按dfB的单个采样条件分组(Seed_zone+目标Altitude) group_by(Seed_zone, Altitude_B) %>% # 按对应组的freq值随机采样 sample_n(first(freq)) %>% # 取消分组并整理输出字段 ungroup() %>% select(`Climate data`, Altitude = Altitude_A, Seed_zone, freq)
示例验证
输入数据
dfA示例:
| Climate data | Altitude | Seed_zone |
|---|---|---|
| 5.107707 | 305 | 101 |
| 4.845323 | 499 | 203 |
| 2.985152 | 7 | 101 |
| 22.17268 | 299 | 101 |
dfB示例:
| Altitude | Seed_zone | freq |
|---|---|---|
| 300 | 101 | 2 |
| 502 | 203 | 1 |
输出结果
运行代码后将得到符合预期的结果:
| Climate data | Altitude | Seed_zone | freq |
|---|---|---|---|
| 5.107707 | 305 | 101 | 2 |
| 22.17268 | 299 | 101 | 2 |
| 4.845323 | 499 | 203 | 1 |
代码逻辑说明
inner_join:仅保留Seed_zone匹配的记录,通过后缀区分两个数据框的Altitude字段filter:精准筛选出dfA中Altitude在dfB目标值±10范围内的样本group_by:按dfB的单个采样条件分组,确保每个条件独立执行采样逻辑sample_n:使用每组对应的freq值完成随机采样- 最后通过
select整理字段格式,移除多余后缀
内容的提问来源于stack exchange,提问作者user22141110
相关产品推荐
相关产品推荐

