1

我想知道您是否可以帮助我设计一种轻松的方法来编码我正在使用的这个国家年事件数据。

在下面的示例中,每一行都对应一个正在进行的事件(我最终会将其折叠到一个更广泛的面板数据集中,这就是它现在看起来很裸露的原因)。因此,例如,国家 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

我想要做的是创建“开始”和“持续”变量。此示例数据框中的“持续”变量很容易。基本上: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

如果您能想到在 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
4

2 回答 2

5

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

Data$onset <- with(Data, ave(year, country, FUN = function(x)
                 as.integer(c(TRUE, tail(x, -1L) != head(x, -1L) + 1L))))
于 2013-06-10T23:42:39.470 回答
0

你也可以这样做:

library(data.table)  
setDT(Data)[, onset := (min(country*year)/country  == year) + 0L, country]

当您拥有更大的数据集时,这可能会非常快。

于 2016-11-06T07:21:54.383 回答