如何结合条件if语句使用floor_date函数?
问题解决:按月份天数条件使用floor_date分组日期
问题描述
尝试为数据集添加一列,用floor_date处理日期:31天的月份(如January、August)按16天分组,30天的月份(如April)按15天分组,但执行条件语句时触发错误:
Error in match(x, table, nomatch = 0L) : 'match' requires vector arguments
错误原因
- 普通
if语句是标量判断逻辑,只能处理单个布尔值,无法对数据集中的每行做条件判断; - 原代码中直接调用
lubridate::month函数而非数据集中的month列,导致判断对象错误; - 冗余代码:
as.Date(paste(StartDate))完全没必要,因为StartDate本身就是Date类型。
解决方案
使用dplyr提供的向量化条件函数(case_when或if_else),对每行数据应用不同的floor_date规则:
方法1:用case_when(多场景友好)
library(tidyverse) # 加载原数据集(数据集定义代码省略) a <- a %>% mutate( new = case_when( month %in% c("January", "August") ~ lubridate::floor_date(StartDate, "16 days"), TRUE ~ lubridate::floor_date(StartDate, "15 days") ) )
方法2:用if_else(二元条件更简洁)
a <- a %>% mutate( new = if_else( month %in% c("January", "August"), lubridate::floor_date(StartDate, "16 days"), lubridate::floor_date(StartDate, "15 days") ) )
验证结果
运行后查看数据集a,new列会根据每行的月份自动应用对应的分组规则:
- January、August的日期会按16天为一组向下取整;
- April的日期会按15天为一组向下取整。
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

