You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr基于两列数值范围将数据拆分为4个子集?

数据按时间范围拆分的解决方案

需求说明

需要将数据拆分为4个时间子集:

  • P1:1815-1865
  • P2:1865-1915(规则:只要upper或lower落在该范围内,即保留数据)
  • P3:1915-1965
  • P4:1965-2013

原代码问题分析

原代码中filter(between(upper:lower, 1815, 1865))用法错误:

  • upper:lower会生成从lower到upper的数值序列,而非判断区间重叠
  • between()函数仅接受单个数值作为第一个参数,无法直接传入序列

修正后的完整代码

# 读取数据
dat <- read_csv("data/Iceland.csv")

# 按年份排序(原代码arrange(dat)错误,需指定排序列)
dat <- dat %>% arrange(year)

# 计算上下限(改用mutate更符合tidyverse风格)
dat <- dat %>% 
  mutate(upper = year + year_error,
         lower = year - year_error)

# 拆分各时间段子集
# P1:1815-1865,规则同P2:upper或lower落在区间内则保留
p1 <- dat %>% 
  filter(between(upper, 1815, 1865) | between(lower, 1815, 1865))

# P2:1865-1915,按需求筛选
p2 <- dat %>% 
  filter(between(upper, 1865, 1915) | between(lower, 1865, 1915))

# P3:1915-1965
p3 <- dat %>% 
  filter(between(upper, 1915, 1965) | between(lower, 1915, 1965))

# P4:1965-2013
p4 <- dat %>% 
  filter(between(upper, 1965, 2013) | between(lower, 1965, 2013))

逻辑说明

  • 用between()分别判断upper和lower是否在目标区间内
  • 用逻辑或|连接两个条件,满足任意一个就保留数据
  • 若你需要的是区间完全包含在目标时间段内,可将逻辑或|改为逻辑与&,并调整条件为lower >= 起始年且upper <= 结束年

内容的提问来源于stack exchange,提问作者Sophie Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:05:08