R语言中调整排放数据集NACE分类并解决聚合求和为0的问题
解决EU NACE REV.2分类映射与求和异常问题
问题核心
你遇到的TOT_IND和MARKT求和为0的问题,本质是错误地用单个NACE代码匹配逻辑处理聚合类分类:原始排放数据集的分类是单个NACE Rev.2代码(如A、B、C),而TOT_IND(全行业)、MARKT(特定行业子集)是聚合类,直接在case_when里写nace_code == "TOT_IND"会因为无匹配项生成空值,最终求和为0。
解决方案
方案1:先映射细分分类,再单独生成聚合类
先完成单个NACE代码到目标细分分类的映射,再通过分组求和生成两个聚合类的数据,最后合并所有分类:
library(tidyverse) # 1. 处理单个NACE代码到细分目标分类的映射 emissions_data <- emissions_data %>% mutate(target_sector = case_when( nace_code %in% "A" ~ "AGRICULTURE", nace_code %in% c("B", "C") ~ "MANUFACTURING", nace_code %in% "D" ~ "UTILITIES", # 补充你的其他细分分类映射规则 TRUE ~ NA_character_ )) # 2. 生成TOT_IND聚合数据(A-U全行业) tot_ind_data <- emissions_data %>% summarise( target_sector = "TOT_IND", emissions = sum(emissions, na.rm = TRUE), # 按需要保留的维度(如年份、国家)分组 .by = c(year, country) ) # 3. 生成MARKT聚合数据(排除L、O、P、Q、T、U) markt_data <- emissions_data %>% filter(!nace_code %in% c("L", "O", "P", "Q", "T", "U")) %>% summarise( target_sector = "MARKT", emissions = sum(emissions, na.rm = TRUE), .by = c(year, country) ) # 4. 合并所有分类数据 final_emissions_data <- bind_rows(emissions_data, tot_ind_data, markt_data)
方案2:在case_when中标记聚合类归属,再分组求和
如果希望在单步中完成标记,可通过rowwise()和列表嵌套标记每行所属的所有目标分类,最后聚合求和:
emissions_data <- emissions_data %>% rowwise() %>% mutate( target_sector = list(c( # 标记细分分类 case_when( nace_code %in% "A" ~ "AGRICULTURE", nace_code %in% c("B", "C") ~ "MANUFACTURING", # 补充其他细分规则 TRUE ~ NA_character_ ), # 所有行都归属TOT_IND "TOT_IND", # 符合条件的行归属MARKT ifelse(!nace_code %in% c("L", "O", "P", "Q", "T", "U"), "MARKT", NA_character_) )) %>% keep(~!is.na(.)) # 过滤空值 ) %>% unnest(target_sector) %>% # 按目标分类、维度分组求和 group_by(target_sector, year, country) %>% summarise(emissions = sum(emissions, na.rm = TRUE), .groups = "drop")
关键排查点
- 检查原始数据的NACE代码格式:确认是否存在大小写差异(如
"l"和"L")、前缀后缀(如"NACE_L"),可通过unique(emissions_data$nace_code)查看所有分类值 - 验证映射结果:用
filter(target_sector == "TOT_IND")查看映射后的数据,如果为空,说明匹配逻辑错误 - 确保求和时保留必要维度:如果数据包含年份、国家等分组维度,必须按这些维度分组后再求和,避免跨维度错误聚合
内容的提问来源于stack exchange,提问作者Lucas van der List
相关产品推荐
相关产品推荐

