如何用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
相关产品推荐
相关产品推荐

