【问题标题】:Construct a variable that conditionally takes a certain value until another condition is met构造一个有条件地取某个值直到满足另一个条件的变量
【发布时间】:2018-11-04 13:02:25
【问题描述】:

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

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

我现在要做的是创建一个新的二进制变量,该变量将冲突后年份标识为 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

我该怎么办?

【问题讨论】:

  • 其他用户将您的问题标记为低质量和需要改进。我重新措辞/格式化您的输入,使其更容易阅读/理解。请查看我的更改以确保它们反映您的意图。但我认为你的问题仍然无法回答。 现在应该edit你的问题,添加缺失的细节(见minimal reproducible example)。如果您对我有其他问题或反馈,请随时给我留言。

标签: r database loops if-statement


【解决方案1】:

您可能不应该那样使用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

【讨论】:

  • Aww 非常感谢你让我免于绝望(我猜是严重的脱发 :))
猜你喜欢
  • 2019-09-19
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多