R语言中按特定日期规则对列表内数值进行缩放的实现方法
实现需求的R代码方案
先把你的原始数据放出来:
list1 <- list() list1$date <- c("01/06/2002", "02/06/2002", "03/06/2002", "04/06/2002", "05/06/2002", "01/07/2002", "19/07/2002", "11/07/2002", "15/07/2002", "29/07/2002", "03/07/2002") list1$value1 <- c(100,200,300,100,200,300,100,200,300,100,200)
接下来按规则处理value1,步骤如下:
转换日期格式并提取关键信息
原始日期是字符串格式,先转成标准日期格式,再提取日、年月分组标识,方便后续判断:# 用lubridate包处理日期(需要先安装install.packages("lubridate")) library(lubridate) list1$date <- dmy(list1$date) list1$day <- day(list1$date) list1$year_month <- floor_date(list1$date, "month")如果不想用额外包,用基础R也能实现:
list1$date <- as.Date(list1$date, format = "%d/%m/%Y") list1$day <- as.integer(format(list1$date, "%d")) list1$year_month <- as.Date(format(list1$date, "%Y-%m-01"))处理每月1-7日的最大值翻倍
先按年月分组,找出每个月1-7日区间里的最大值,再给对应位置的value1翻倍:# 初始化缩放后的数值列 list1$scaled_value <- list1$value1 # 提取每个月1-7日的最大值 max_1to7 <- tapply( list1$value1[list1$day %in% 1:7], list1$year_month[list1$day %in% 1:7], max ) # 给对应最大值位置翻倍 for (ym in names(max_1to7)) { target_idx <- list1$year_month == ym & list1$day %in% 1:7 & list1$value1 == max_1to7[ym] list1$scaled_value[target_idx] <- list1$scaled_value[target_idx] * 2 }处理每月28日及之后的数值翻倍
直接筛选日数>=28的位置,将对应scaled_value翻倍:list1$scaled_value[list1$day >= 28] <- list1$scaled_value[list1$day >= 28] * 2
最后查看处理后的结果:
list1[c("date", "value1", "scaled_value")]
输出结果如下:
date value1 scaled_value 1 2002-06-01 100 100 2 2002-06-02 200 200 3 2002-06-03 300 600 # 6月1-7日最大值,翻倍 4 2002-06-04 100 100 5 2002-06-05 200 200 6 2002-07-01 300 600 # 7月1-7日最大值,翻倍 7 2002-07-19 100 100 8 2002-07-11 200 200 9 2002-07-15 300 300 10 2002-07-29 100 200 # 29日>=28,翻倍 11 2002-07-03 200 200
内容的提问来源于stack exchange,提问作者Bella_18
相关产品推荐
相关产品推荐

