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

R语言calendR包绘制AQI日历图时出现条件长度错误

解决calendR绘制社区2AQI日历图的报错问题

问题描述

使用R语言calendR包绘制2024年社区空气质量指数(AQI)日历图时,社区1的图表可正常生成,但绘制社区2时触发以下错误:

Error in if (special.days != "weekend") { : the condition has length > 1

可复现代码

数据准备代码

library(calendR)
library(tidyverse)

# 创建社区1数据
julian_community1 <- c(299:366) # 10月25日-12月31日的儒略日
PM25_community1 <- c(3.4,1.3,1.2,1.2,0.4,3.4,1.0, # 10月数据
                     0.8,0.3,6.0,0.9,5.3,4.4,3.4,1.2,0.7,0.6,0.8,0.3,0.9,0.9,4.1,0.7,0.3,0.4,2.1,1.4,5.2,4.2,3.9,1.4,0.8,0.7,0.8,0.3,1.9,0.8, # 11月数据
                     0.7,1.2,1.7,1.8,3.8,6.1,5.9,1.2,0.7,0.3,0.6,2.9,2.5,1.1,0.5,0.9,1.5,1.1,0.8,1.5,0.8,2.2,4.6,1.2,1.0,3.3,0.9,0.9,4.6,1.2,2.8) # 12月数据
site_community1 <- rep("community 1", 68)

# 创建社区2数据
julian_community2 <- c(69:366) # 3月9日-12月31日的儒略日
PM25_community2 <- c(1.6,1.5,3.4,5.8,5.1,2.6,5.4,2.8,2.5,3.7,6.2,4.8,rep(NA,286)) 
site_community2 <- rep("community 2", 298)

# 合并数据框
data <- as.data.frame(c(julian_community1,julian_community2))
colnames(data) <- "julian"
data$PM25 <- c(PM25_community1, PM25_community2)
data$site_name <- c(site_community1,site_community2)

# 生成AQI分类
one <- data$PM25 <= 9.0
two <- data$PM25 >= 9.1 & data$PM25 <= 35.4
three <- data$PM25 >= 35.5 & data$PM25 <= 55.4
four <- data$PM25 >= 55.5 & data$PM25 <= 125.4
five <- data$PM25 >= 125.5 & data$PM25 <= 225.4
six <- data$PM25 >= 225.5
data$AQI <- NA
data <- data %>% mutate(AQI = case_when(
  one ~ "1",
  two ~ "2",
  three ~ "3",
  four ~ "4",
  five ~ "5",
  six ~ "6"
))

社区1可运行的绘图代码

community <- "community 1"
year <- 2024

# 筛选各AQI分类的日期
good <- data %>% filter(site_name == community & AQI == 1)
moderate <- data %>% filter(site_name == community & AQI == 2)
unhealthy_sg <- data %>% filter(site_name == community & AQI == 3)
unhealthy <- data %>% filter(site_name == community & AQI == 4)
veryunhealthy <- data %>% filter(site_name == community & AQI == 5)
hazardous <- data %>% filter(site_name == community & AQI == 6)

# 创建事件向量
events <- rep(NA, 365)
events[good$julian] <- "Good" 
events[moderate$julian] <- "Moderate"
events[unhealthy_sg$julian] <- "Unhealthy for sensitive groups"
events[unhealthy$julian] <- "Unhealthy"
events[veryunhealthy$julian] <- "Very unhealthy"
events[hazardous$julian] <- "Hazardous"

# 生成颜色 palette
communitydata <- data %>% filter(site_name == community)
uniqueAQI <- unique(communitydata$AQI)
color <- data.frame(uniqueAQI)
color$color <- NA
color <- color %>% mutate(color = case_when(
  uniqueAQI == 1 ~ "green",
  uniqueAQI == 2 ~ "yellow",
  uniqueAQI == 3 ~ "orange",
  uniqueAQI == 4 ~ "red",
  uniqueAQI == 5 ~ "purple",
  uniqueAQI == 6 ~ "maroon"
))
palette <- as.vector(subset(color$color, !(is.na(color$color))))
desired_order <- c("green","yellow","orange","red","purple","maroon")
palette <- palette[order(match(palette, desired_order))]

# 绘制日历图
calendR(year = year,
        start = "M",
        special.days = events,
        special.col = palette,
        low.col = "white",
        legend.pos = "right",
        legend.title = "Air Quality Index",
        title = paste(community,"AQI in 2024" ),
        mbg.col = "lightgray",
        months.col = "white",
        weeknames = c("M","T","W","T","F","S","S")
)

触发错误的社区2绘图代码

community <- "community 2"
year <- 2024

# 筛选各AQI分类的日期
good <- data %>% filter(site_name == community & AQI == 1)
moderate <- data %>% filter(site_name == community & AQI == 2)
unhealthy_sg <- data %>% filter(site_name == community & AQI == 3)
unhealthy <- data %>% filter(site_name == community & AQI == 4)
veryunhealthy <- data %>% filter(site_name == community & AQI == 5)
hazardous <- data %>% filter(site_name == community & AQI == 6)

# 创建事件向量
events <- rep(NA, 365) # 问题点:2024是闰年,应该是366天
events[good$julian] <- "Good" 
events[moderate$julian] <- "Moderate"
events[unhealthy_sg$julian] <- "Unhealthy for sensitive groups"
events[unhealthy$julian] <- "Unhealhty" # 拼写错误
events[veryunhealthy$julian] <- "Very unhealthy"
events[hazardous$julian] <- "Hazardous"

# 生成颜色 palette
communitydata <- data %>% filter(site_name == community)
uniqueAQI <- unique(communitydata$AQI)
color <- data.frame(uniqueAQI)
color$color <- NA
color <- color %>% mutate(color = case_when(
  uniqueAQI == 1 ~ "green",
  uniqueAQI == 2 ~ "yellow",
  uniqueAQI == 3 ~ "orange",
  uniqueAQI == 4 ~ "red",
  uniqueAQI == 5 ~ "purple",
  uniqueAQI == 6 ~ "maroon"
))
palette <- as.vector(subset(color$color, !(is.na(color$color))))
desired_order <- c("green","yellow","orange","red","purple","maroon")
palette <- palette[order(match(palette, desired_order))]

# 绘制日历图
calendR(year = year,
        start = "M",
        special.days = events,
        special.col = palette,
        low.col = "white",
        legend.pos = "right",
        legend.title = "Air Quality Index",
        title = paste(community,"AQI in 2024" ),
        mbg.col = "lightgray",
        months.col = "white",
        weeknames = c("M","T","W","T","F","S","S")
)

错误原因分析

  1. 闰年日期长度不匹配:2024年是闰年,有366天,但创建events时用了rep(NA, 365),而社区2的julian包含366(12月31日),导致events[good$julian]赋值时,索引366超出events的长度(365),所有元素始终为NA。
  2. calendR内部逻辑限制:当special.days是全NA的向量时,calendR内部的if (special.days != "weekend")判断会返回长度为365的逻辑向量(而非单个TRUE/FALSE),触发R的if条件长度错误。

解决方案

修改后的社区2绘图代码

community <- "community 2"
year <- 2024

# 筛选各AQI分类的日期
good <- data %>% filter(site_name == community & AQI == 1)
moderate <- data %>% filter(site_name == community & AQI == 2)
unhealthy_sg <- data %>% filter(site_name == community & AQI == 3)
unhealthy <- data %>% filter(site_name == community & AQI == 4)
veryunhealthy <- data %>% filter(site_name == community & AQI == 5)
hazardous <- data %>% filter(site_name == community & AQI == 6)

# 修正1:创建366长度的events向量(适配闰年)
events <- rep(NA, 366)
events[good$julian] <- "Good" 
events[moderate$julian] <- "Moderate"
events[unhealthy_sg$julian] <- "Unhealthy for sensitive groups"
events[unhealthy$julian] <- "Unhealthy" # 修正拼写错误
events[veryunhealthy$julian] <- "Very unhealthy"
events[hazardous$julian] <- "Hazardous"

# 生成颜色 palette
communitydata <- data %>% filter(site_name == community)
uniqueAQI <- unique(communitydata$AQI)
color <- data.frame(uniqueAQI)
color$color <- NA
color <- color %>% mutate(color = case_when(
  uniqueAQI == 1 ~ "green",
  uniqueAQI == 2 ~ "yellow",
  uniqueAQI == 3 ~ "orange",
  uniqueAQI == 4 ~ "red",
  uniqueAQI == 5 ~ "purple",
  uniqueAQI == 6 ~ "maroon"
))
palette <- as.vector(subset(color$color, !(is.na(color$color))))
desired_order <- c("green","yellow","orange","red","purple","maroon")
palette <- palette[order(match(palette, desired_order))]

# 绘制日历图
calendR(year = year,
        start = "M",
        special.days = events,
        special.col = palette,
        low.col = "white",
        legend.pos = "right",
        legend.title = "Air Quality Index",
        title = paste(community,"AQI in 2024" ),
        mbg.col = "lightgray",
        months.col = "white",
        weeknames = c("M","T","W","T","F","S","S")
)

关键修改点

  • 将events <- rep(NA, 365)改为events <- rep(NA, 366),适配2024年闰年的366天,确保julian=366的日期能正确赋值。
  • 修正原代码中"Unhealhty"的拼写错误为"Unhealthy",避免图例显示异常。

内容的提问来源于stack exchange,提问作者Kelly Ireland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:22:02