如何在R中处理复杂的数据聚合问题?

2vuwiymt  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在研究1966年至2021年全球所有内阁部长的数据。总的来说,该数据集包含177个国家的56,063名内阁成员的数据,总计8,811个国家年。我的目标是计算每个内阁部长在数据中存在的过程中被改组的次数。
我想根据每年7月收集的数据,如果一个部长在连续几年担任不同的内阁职位,我想将他或她编码为已经改组(例如,在$t$年担任国防部长,在$t+1$年担任经济部长,在$t+2$年回到国防部长)。考虑到每年的数据收集间隔,一个人可能在同一年内在多个职位之间移动,这是我的数据集中无法捕捉到的细节。因此,虽然我的方法准确地识别了每年的改组,但它可能低估了一年内发生的内阁改组的总体程度。
我的数据中有一些有趣的特征,使得这样做具有挑战性。例如,个人$i$可以在给定的一年中担任多个职位$p$(例如,一个人可能既担任国防部部长,然后又在另一次观察中担任经济部长,在这种情况下,将存在对同一个人的两次观察)。我不想编码为重新 Shuffle 的情况下,你保持一个位置,从一年到一年,但然后采取额外的部在随后的一年。例如,一个人$i$在$t$年担任国防部长,但在$t+1$年也担任教育部长(同时保留他的国防部长职位)。只有当你有一个职位,然后得到另一个职位,才算重新 Shuffle 。我也不想把某人被归类为一个国家事实上的领导人的观察结果(例如:总理或总统),在这种情况下,他们不能被改组,但正在进行改组。
下面是我在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))

这似乎不是我想要的。例如,它似乎捕捉了连续几年在同一职位上任职的个人,但事实并非如此。这里是完整数据集的link

3htmauhk

3htmauhk1#

leader列似乎不准确。过滤leader == 0后仍有“总理”和“总统”。此外,还有部长和其他非领导者分类标记为领导者。您的coreminister列似乎也不正确。
为了检测您在问题中描述的重新 Shuffle ,最好只包含classification == "Minister (Full Rank)"。下面,我将展示开发满足您的规范的解决方案的步骤:

# `readr::read_csv()` repairs column names so we don't have to worry about
# duplicate column names. Also, your data is moderately sized, and the use of
# `data.table::fread()` isn't warranted.
library(tidyverse)
data <- read_csv("individual_cabinet_autocracy.csv")

# Adding `unique_id`, selecting relevant columns, and filtering rows.
data2 <-
  data |>
  mutate(unique_id = cur_group_id(),
         .by = c(country_isocode, name)) |> 
  select(unique_id, name, year, position, classification) |>
  filter(classification == "Minister (Full Rank)") |>
  arrange(unique_id, year)

# Calculate reshuffles
reshuffle_data2 <-
  data2 |>
  group_by(unique_id, name) |>   
  mutate(reshuffled = position != lag(position)) |> 
  summarize(reshuffle_count = sum(reshuffled, na.rm = TRUE),
            .groups = "drop")

使用您问题中的代码,我们得到“Osvaldo Dorticos Torrado”的重新 Shuffle 计数为2。尽管他第二次和第三次担任部长之间有5年的差距。让我们只计算每年发生的位置变化。

reshuffle_data2 <-
  data2 |>
  group_by(unique_id, name) |>
  mutate(reshuffled = position != lag(position) &
           year - lag(year) == 1) |>
  summarize(reshuffle_count = sum(reshuffled, na.rm = TRUE),
            .groups = "drop")

reshuffle_data2 |> 
  arrange(desc(reshuffle_count))
#> # A tibble: 17,252 × 3
#>    unique_id name                reshuffle_count
#>        <int> <chr>                         <int>
#>  1     15906 Qaboos Said Said                 37
#>  2     11507 H. Kamuzu Banda                  23
#>  3     20544 Jayakumar Shunmugam              21
#>  4      8696 Joseph Mobutu                    17
#>  5     19030 Than Shwe                        17
#>  6      7705 Georges Rawiri                   16
#>  7     20522 Edward W. Barker                 16
#>  8      9750 Jackson Makweta                  13
#>  9     19157 R. Premadasa                     13
#> 10      5516 Toumany Sangare                  12
#> # ℹ 17,242 more rows

现在我们得到了“卡布斯赛义德赛义德”作为最改组的人。通过查看数据,我们看到他同时拥有两个部长职位,并且在某个时候,第三个职位被添加。按照你的描述,这不应该算重新 Shuffle 。为了对重新 Shuffle 进行分类,我们必须检测在获得新位置时是否丢失了先前的位置。
要做到这一点,我们将转换数据,以便每行表示一个人在一个位置上花费的时间。

reshuffle_prep <-
  data2 |>
  group_by(unique_id, name, position) |>
  summarise(
    year_start = min(year),
    year_end = max(year),
    .groups = "drop"
  ) |>
  group_by(unique_id, name) |>
  arrange(unique_id, year_start) |>
  mutate(
    reshuffled = position != lag(position) &
      year_start - lag(year_end) == 1 & lag(year_end) < year_start
  )

reshuffle_prep |>
  count(unique_id, name, reshuffled, sort = TRUE) |>
  filter(reshuffled)
#> # A tibble: 4,530 × 4
#> # Groups:   unique_id, name [4,530]
#>    unique_id name                   reshuffled     n
#>        <int> <chr>                  <lgl>      <int>
#>  1      5516 Toumany Sangare        TRUE          12
#>  2      7705 Georges Rawiri         TRUE          11
#>  3      5512 NFamara Keita          TRUE          10
#>  4      7691 Jean-Stanislas Migolet TRUE          10
#>  5      9750 Jackson Makweta        TRUE          10
#>  6      5511 Damantang Camara       TRUE           9
#>  7      9360 Ruhakana Rugunda       TRUE           9
#>  8      5502 Moussa Diakite         TRUE           8
#>  9      8577 Pierre Moussa          TRUE           8
#> 10      9553 Jeremiah Nyagah        TRUE           8
#> # ℹ 4,520 more rows

现在“图马尼·桑加雷”似乎是被 Shuffle 最多的人。查看数据,似乎一些检测到的改组可能是由于位置命名的不一致(“Min.人民军队”与。人民军队的最高统帅。如果这是一个问题,你应该考虑协调职位名称,但我认为这超出了这个问题的范围。

相关问题