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") )
错误原因分析
- 闰年日期长度不匹配:2024年是闰年,有366天,但创建
events时用了rep(NA, 365),而社区2的julian包含366(12月31日),导致events[good$julian]赋值时,索引366超出events的长度(365),所有元素始终为NA。 - 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
相关产品推荐
相关产品推荐

