我正在尝试使用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))
但我认为我走错了方向,我不能把时间维度正确...
答案 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