如何用R处理复杂的内阁成员职位变动统计问题?
内阁成员职位变动统计问题
我正在处理1966-2021年全球内阁成员数据集,包含177个国家的56063名成员,共8811个国家-年份观测值。目标是统计每位非领导人内阁成员在数据周期内的职位变动(reshuffle)次数。
变动定义
- 连续年份(每年7月采集数据)中,成员担任的职位完全变更时视为一次变动(例:t年任国防部长,t+1年任经济部长,t+2年重回国防部长,计2次变动)。
- 年度采集数据无法捕捉同年内多次变动,因此统计结果可能低估实际次数。
- 排除情况:
- 保留原职位同时新增职位(如t年任国防部长,t+1年兼任教育部长)不算变动;
- 排除国家实际领导人(总理、总统等),他们是变动发起者,不纳入统计。
现有代码问题
我尝试的R代码未达到预期效果,例如误将连续年份担任同一职位的成员统计为职位变动:
# Load packages library(dplyr) library(tidyr) library(data.table) # Load data data <- fread("individual_cabinet_autocracy.csv") # Identify the duplicate column names duplicate_column_names <- names(data)[duplicated(names(data))] # Step 2: Rename or remove the duplicate columns data <- data %>% rename_with(~ paste0(., "_renamed"), all_of(duplicate_column_names)) # Calculate reshuffles reshuffle_data <- data %>% filter(leader == 0) %>% # Exclude leaders arrange(unique_id, year) %>% # Arrange data by name and year group_by(unique_id) %>% # Group data by individual names mutate(reshuffled = position != lag(position)) %>% # Create a reshuffled indicator column summarize(reshuffle_count = sum(reshuffled, na.rm = TRUE)) # Sum reshuffles for each individual # Arrange the summary data in descending order of total_movements reshuffle_data <- reshuffle_data %>% arrange(desc(reshuffle_count))
问题根源与修正方案
现有代码的核心问题:
- 未处理同一成员同年多职位的情况:当成员一年有多个职位时,
lag(position)会逐行对比,导致同一人同年内的不同职位被误判为变动。 - 未定义“完全变更职位”的判断逻辑:需要先汇总每个成员每年的所有职位,再对比相邻年份的职位集合是否完全不同。
修正后的代码:
library(dplyr) library(tidyr) library(data.table) # 加载数据 data <- fread("individual_cabinet_autocracy.csv") # 处理重复列名 duplicate_cols <- names(data)[duplicated(names(data))] data <- data %>% rename_with(~paste0(., "_renamed"), all_of(duplicate_cols)) # 统计职位变动次数 reshuffle_data <- data %>% filter(leader == 0) %>% # 排除领导人 # 按成员+年份汇总所有职位,生成每个成员每年的职位集合 group_by(unique_id, year) %>% summarize(positions = list(sort(unique(position))), .groups = "drop") %>% arrange(unique_id, year) %>% group_by(unique_id) %>% # 对比相邻年份的职位集合:完全不同则计为变动 mutate( prev_positions = lag(positions), # 判断:前一年有职位记录,且两年职位集合完全不重叠(完全变更) reshuffled = ifelse( !is.na(prev_positions), length(intersect(unlist(positions), unlist(prev_positions))) == 0, FALSE ) ) %>% # 统计每个成员的总变动次数 summarize(reshuffle_count = sum(reshuffled, na.rm = TRUE), .groups = "drop") %>% arrange(desc(reshuffle_count))
代码说明
- 先按
unique_id和year分组,将每个成员每年的所有职位整理为一个排序后的集合(避免因职位顺序导致误判); - 用
lag()获取前一年的职位集合,通过判断两年职位集合的交集是否为空,确定是否为完全职位变动; - 最后汇总每个成员的变动次数,按次数降序排列。
内容的提问来源于stack exchange,提问作者w5698
相关产品推荐
相关产品推荐

