使用R cartogram包绘制连续面积图时出现下标赋值NA错误
解决cartogram_cont函数的NA下标赋值错误问题
问题代码
#Create the dataframe data(wrld_simpl) world_map4 <- wrld_simpl news2 <- news %>% group_by(iso_a3) %>% select(iso_a3, Mentions_sum, Goldstein_avg) %>% slice(1) %>% filter(!iso_a3=="NA") world_map5 <- merge(world_map4, news2, by.x = "ISO3", by.y = "iso_a3", all.x = TRUE, duplicateGeoms=TRUE) world_map6 <- st_as_sf(world_map5) world_map7 <- st_transform(world_map6, crs = 23038) #Draw the map world_map8 <- world_map7[!is.na(world_map7$Mentions_sum), ] world_cartogram <- cartogram_cont(world_map8, "Mentions_sum", itermax=7)
错误信息
Error in Fij[distance <= radius[j]] <- Fbij[distance <= radius[j]] : NAs are not allowed in subscripted assignments
排查思路
- 检查空间几何有效性:cartogram的计算依赖完整合法的空间几何,执行
st_is_valid(world_map8)查看是否存在无效几何,若有则用world_map8 <- st_make_valid(world_map8)修复。无效几何(如自交、缺失)会导致距离计算时产生NA,触发下标赋值错误。 - 更换合适的投影:当前使用的
crs=23038是针对中东区域的UTM投影,用于全球地图会引发严重变形,导致空间计算异常。建议替换为全球等面积投影,比如:world_map7 <- st_transform(world_map6, crs = 6933) # WGS 84 / NSIDC EASE-Grid 2.0 Global - 检查变量数值特性:
- 确认
Mentions_sum是否存在0值,cartogram_cont对0值处理可能出错,可替换为极小值(如world_map8$Mentions_sum[world_map8$Mentions_sum == 0] <- 1e-5)。 - 若数值差异过大,尝试对数转换(
world_map8$Mentions_log <- log(world_map8$Mentions_sum + 1))后用转换后的变量绘制cartogram。
- 确认
- 降低迭代次数:先将
itermax设为3或5,排除迭代过程中累积误差导致的NA问题。 - 去除重复几何:
merge时启用了duplicateGeoms=TRUE,可能产生重复几何对象引发冲突,执行world_map8 <- dplyr::distinct(world_map8, ISO3, .keep_all = TRUE)去重后再尝试。
内容的提问来源于stack exchange,提问作者johannes
相关产品推荐
相关产品推荐

