如何将日期转为自定义命名列?R语言data.frame数据处理问询
解决方案:调整tidyverse代码实现自定义日期列需求
我看了你的需求和现有代码,原逻辑绕了弯路,我们可以更直接地实现你想要的结果——核心是先筛选出有实际销售的记录,再按产品分组计算总和、首次和末次销售日期。
调整后的代码
library(tidyverse) x <- data.frame( product = c(1,1,1,2,2,2), value_day = c(0,0,150.23,110.98,18.65,0), my_date = c("2019-01-01","2019-01-02","2019-01-03","2019-01-01","2019-01-02","2019-01-03") ) x %>% filter(value_day > 0) %>% # 先过滤掉无销售的无效记录 group_by(product) %>% summarise( total = sum(value_day), first_sell = min(my_date), # 提取该产品首次销售日期 last_sell = max(my_date) # 提取该产品末次销售日期 ) %>% ungroup() # 可选:取消分组状态,转为普通tibble
运行结果
# A tibble: 2 × 4 product total first_sell last_sell <dbl> <dbl> <chr> <chr> 1 1 150. 2019-01-03 2019-01-03 2 2 130. 2019-01-01 2019-01-02
代码逻辑说明
filter(value_day > 0):先排除无销售的日期记录,这些日期不属于有效销售,不需要参与首次/末次销售日期的计算。group_by(product):按产品分组,确保每个产品的统计值独立计算。summarise():一次性生成三个目标字段:total = sum(value_day):计算该产品的总销售额first_sell = min(my_date):取该产品所有有效销售记录中最早的日期last_sell = max(my_date):取该产品所有有效销售记录中最晚的日期
ungroup():可选操作,如果你后续不需要保留分组状态,可以取消分组,让结果成为普通的数据框。
原代码的问题在于先计算总和再筛选,还尝试用slice和spread处理日期,反而把逻辑复杂化了。直接先筛选有效记录再分组汇总,逻辑更清晰,结果也更准确。
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

