R语言 将观察(行)拆分为按月的部分(行)

qacovj5a  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(128)

我目前正在研究国内冲突,我的数据集是UCDP武装冲突数据集。我的重点是内战的每月持续时间。但是,我在将原始的冲突年份数据转换为冲突月份数据时遇到了麻烦。
我将在下面提供我的数据示例:
| 冲突ID|开始日期|结束日期|年|终止|
| --------------|--------------|--------------|--------------|--------------|
| 一百|1946-05-18|不适用|一九四六年|0|
| 一百|1946-05-18| 1947-03-01|一九四七年|1|
| 一百零一|1950-05-01| 1950-07-01|一九四七年|1|
我期待以下结果:
| 冲突ID|年|月份|持续时间|终止|
| --------------|--------------|--------------|--------------|--------------|
| 一百|一九四六年|5| 1| 0|
| 一百|一九四六年|六|2| 0|
| 一百|一九四六年|七|3| 0|
| ......这是什么?|......这是什么?|......这是什么?|......这是什么?||
| 一百|一九四七年|2|九|0|
| 一百|一九四七年|3|十个|1|
任何建议,例子将不胜感激。提前感谢您的时间和专业知识!

wko9yo5t

wko9yo5t1#

一种方法(相当长的“整洁风格”管道,因此您可能希望将其分解以检查哪个执行哪个):

library(tidyr)
library(lubridate)
library(zoo)

df |> ## df is a dataframe of the example data you provided
  mutate(across(ends_with('_date'),
                ~ as.Date(.x) |> as.yearmon()
                )
         ) |>
  group_by(conflict_id) |>
  summarize(start = min(start_date, na.rm = TRUE),
            end = max(end_date, na.rm = TRUE)
            ) |>
  rowwise() |>
  mutate(ym = seq(start, end, 1/12) |> list()) |>
  unnest_longer(ym) |>
  select(conflict_id, ym) |>
  group_by(conflict_id) |>
  mutate(year = year(ym),
         month = month(ym),
         duration = row_number(),
         termination = ifelse(duration < max(duration), 0, 1)
         )
+ # A tibble: 14 x 6
# Groups:   conflict_id [2]
   conflict_id ym         year month duration termination
         <int> <yearmon> <dbl> <dbl>    <int>       <dbl>
 1         100 Mai 1946   1946     5        1           0
 2         100 Jun 1946   1946     6        2           0
## ... lines removed
11         100 Mär 1947   1947     3       11           1
12         101 Mai 1950   1950     5        1           0
13         101 Jun 1950   1950     6        2           0
14         101 Jul 1950   1950     7        3           1
>

相关问题