首页 > 解决方案 > 构造一个有条件地取某个值直到满足另一个条件的变量

问题描述

我有一个面板数据集,其中包含我想确定冲突后年份的冲突数据。

所以我自己构建了一个变量,它用“3”编码了从冲突到和平的过渡。每当一个新国家的值开始时,我都会用 NA 对相同的变量进行编码。小号

我现在要做的是创建一个新的二进制变量,它用 1 和冲突年份标识冲突后年份,并且从不与 0 冲突。为此,我必须每年分配,在转换变量中的 3 之后1 直到同一列中有 NA。如下:

Country       Year   transition    post-conflict
Afghanistan   1994   0  0
Afghanistan   1995   0  0
Afghanistan   1996   3  1
Afghanistan   1997   2  1
Afghanistan   1998   2  1
Albania       1994   NA 0
Albania       1994   2  0

我该怎么办?

标签: rdatabaseloopsif-statement

解决方案


你可能不应该那样使用NA。它会阻止 、 和 等函数whichsumcumsum希望的方式工作。无论如何,您可能不需要标记新国家/地区的第一行,因为您将用于分析的大多数 R 函数都可以分组,Country而无需显示每个组开始位置的特殊标记。

下面我换个NA不同的东西,做transition一个因素。然后您可以使用cumsum创建新列。

library(data.table)
setDT(df) # assuming your data is called df

# fix transition column
df[is.na(transition), transition := 90]
df[, transition := as.factor(transition)]

# create post_conflict column
df[, post_conflict := cumsum(transition == 3), by = Country]

#        Country Year transition post_conflict
# 1: Afghanistan 1994          0             0
# 2: Afghanistan 1995          0             0
# 3: Afghanistan 1996          3             1
# 4: Afghanistan 1997          2             1
# 5: Afghanistan 1998          2             1
# 6:     Albania 1994         90             0
# 7:     Albania 1994          2             0

推荐阅读