R中面板数据中事件开始的编码

ste*_*eve 1 r data-manipulation panel-data

我想知道你是否可以帮助我设计一种毫不费力的方法来编码我正在使用的这个国家/地区年度事件数据.

在下面的示例中,每一行都对应一个正在进行的事件(我最终将折叠成一个更广泛的面板数据集,这就是为什么它现在看起来很简陋).因此,例如,国家29在1920年开始发生事件,并在1921年继续(并结束).国家23在1921年开始了这一事件,持续到1923年.国家35开始了一个事件,发生在1921年,仅在1921年,等等.

country     year
  29        1920
  29        1921
  23        1921
  23        1922
  23        1923
  35        1921
  64        1926
  135       1928
  135       1929
  135       1930
  135       1931
  135       1932
  135       1933
  135       1934
  120       1930
  70        1932
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建"开始"和"持续"变量.此示例数据框中的"正在进行的"变量很容易.基本上:Data$ongoing <- 1

我更感兴趣的是创建"起始"变量.如果它标志着给定国家的事件发生,它将被编码为1.基本上,我想创建一个看起来像这样的变量,给出这个示例数据.

country     year     onset
  29        1920       1
  29        1921       0  
  23        1921       1
  23        1922       0
  23        1923       0
  35        1921       1
  64        1926       1
  135       1928       1
  135       1929       0
  135       1930       0
  135       1931       0
  135       1932       0
  135       1933       0
  135       1934       0
  120       1930       1
  70        1932       1
Run Code Online (Sandbox Code Playgroud)

如果你能想到在R中做到这一点的轻松方法(在Excel等电子表格程序中使用它时最大限度地减少人为错误的可能性),我会很感激.我确实看到了这个相关的问题,但这个人的数据集看起来不像我的,可能需要采用不同的方法.

谢谢.下面是此示例数据的可重现代码.

country <- c(29,29,23,23,23,36,64,135,135,135,135,135,135,135,120,70)
year <- c(1920,1921,1921,1922,1923,1921,1926,1928,1929,1930,1931,1932,1933,1934,1930,1932)

Data=data.frame(country=country,year=year)
summary(Data)
Data
Run Code Online (Sandbox Code Playgroud)

flo*_*del 5

这应该有效,即使每个国家有多个发起:

Data$onset <- with(Data, ave(year, country, FUN = function(x)
                 as.integer(c(TRUE, tail(x, -1L) != head(x, -1L) + 1L))))
Run Code Online (Sandbox Code Playgroud)