长面板中具有时间和id条件的虚拟变量

时间:2014-06-27 14:56:02

标签: r zoo dummy-data

我正在尝试使用time,id和许多其他变量向面板数据集添加一个虚拟变量。

library(zoo)
geo = c("AT","AT","AT","BE","BE","BE","DE","DE","DE")
time = c("1990Q1","1990Q2","1990Q3","1990Q1","1990Q2","1990Q3","1990Q1","1990Q2","1990Q3")
Data <- as.data.frame(cbind(geo, time))
Data$time = as.yearqtr(Data$time)
实际上有20个国家和97个季度。我不会逐个解决'geo'元素,但是(时间&gt; 2004Q1)会很好

我想在1990年第二季度开始为奥地利和德国打造假人。所以我想到达:

    geo time     dummmy
1   AT  1990 Q1  0
2   AT  1990 Q2  1
3   AT  1990 Q3  1
4   BE  1990 Q1  0
5   BE  1990 Q2  0
6   BE  1990 Q3  0
7   DE  1990 Q1  0
8   DE  1990 Q2  1
9   DE  1990 Q3  1

我无法接近,我正在考虑stata逻辑(生成变量,如果是这样,这是其他的东西)但是我在R中最接近的是创建单独的国家虚拟变量,然后用时间进行cbinding变量并在时间变量上对它们进行子集化,然后在提取所有单个虚拟变量并将其与我的原始数据进行cbinding之前将它们相加。这不可能是接近最佳解决方案的任何地方(并且不完全有效),因为它大约有40行代码......这应该很容易做到,不是吗?

任何帮助都会很棒!

P.S .: 我的尝试遵循以下几点:

AT <- as.numeric(Data$geo == "AT")
DE <- as.numeric(Data$geo == "DE")

AT <- as.data.frame(cbind(Data$time, AT))
DE <- as.data.frame(cbind(Data$time, DE))

但我认为我走错了方向,我不能把时间维度正确...

2 个答案:

答案 0 :(得分:2)

看起来您必须使用zoo库来as.yearqtr功能。如果是这样的话,那就是&#34;时间&#34;列与标准比较运算符相当。所以基本上看起来你只想要时间&gt;&#34; 1990Q1&#34;和&#34; geo&#34;是&#34; AT&#34;或&#34; DE&#34;。你可以用

做到这一点
Data$dummy<-(Data$time>as.yearqtr("1990Q1") & Data$geo %in% c("AT","DE"))+0

这里做+0将逻辑真/假转为0/1

答案 1 :(得分:1)

您可以对yearqtr个对象使用标准比较,请尝试:

Data$time >= "1990 Q2"
# [1] FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
Data$geo %in% c("AT", "DE") & Data$time >= "1990 Q2"
# [1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE

Data$dummy <- as.numeric(Data$geo %in% c("AT", "DE") & Data$time >= "1990 Q2")
Data
#   geo    time dummy
# 1  AT 1990 Q1     0
# 2  AT 1990 Q2     1
# 3  AT 1990 Q3     1
# 4  BE 1990 Q1     0
# 5  BE 1990 Q2     0
# 6  BE 1990 Q3     0
# 7  DE 1990 Q1     0
# 8  DE 1990 Q2     1
# 9  DE 1990 Q3     1