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

如何用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))

问题根源与修正方案

现有代码的核心问题:

  1. 未处理同一成员同年多职位的情况:当成员一年有多个职位时,lag(position)会逐行对比,导致同一人同年内的不同职位被误判为变动。
  2. 未定义“完全变更职位”的判断逻辑:需要先汇总每个成员每年的所有职位,再对比相邻年份的职位集合是否完全不同。

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:47:50