0

我正在尝试将虚拟变量添加到具有时间、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'元素,但是(时间> 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中最接近的是创建单独的国家假人,然后将每个与时间变量和子集绑定它们在时间变量上,然后提取所有单个虚拟对象并将它们添加在一起,然后再将其与我的原始数据绑定。这不可能接近最佳解决方案(并且不完全有效),因为它大约有 40 行代码......这应该很容易做到,不是吗?

任何帮助都会很棒!

ps:我的尝试是这样的:

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))

但我认为我走错了方向,我无法正确获得时间维度......

4

2 回答 2

2

看起来您必须使用该函数的zooas.yearqtr。如果是这种情况,这会使“时间”列与标准比较运算符具有可比性。所以基本上看起来你只想要时间>“1990Q1”和“geo”是“AT”或“DE”的所有值。你可以这样做

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

这里做+0将逻辑真/假变成0/1

于 2014-06-27T15:08:51.567 回答
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
于 2014-06-27T15:09:07.727 回答