我试图根据ifelse函数在R中创建一系列变量:
<div id = 'login'>
<form method = 'POST' action = 'login.php'>
<input class = 'login' type = 'text' name = 'username' maxlength = '20' placeholder = 'Username' size = '10'>
<input class = 'login' type = 'password' name = 'password' maxlength = '20' placeholder = 'Password' size = '10'>
<input class = 'login' id = 'loginButton' type = 'submit' value = 'Login'>
</form>
</div>
我在1970年至2007年期间这样做了。现在,我每一年都有一条线。
在stata中,我可以通过以下方式执行此操作:
comp1990<-ifelse(year_begin<1990 & year_end>1990,1,0)
comp1991<-ifelse(year_begin<1991 & year_end>1991,1,0)
comp1992<-ifelse(year_begin<1992 & year_end>1992,1,0)
在 R 中是否有类似的直接方法?我知道forvalues n=1970(1)2007 {
gen comp\`n'== (year_begin<\`n' & year_end>\`n')
}
循环不是很好。也许使用申请?
如果银行分行存在于第n年,那么我基本上做的是创建一个虚拟= 1(否则如果银行分支在第n年之前建立,如果它在第n年之后关闭),这意味着它在第n年开始运作。
提前感谢您的帮助!
答案 0 :(得分:0)
尝试:
sapply(1970:2007,function(x){ ifelse(year_begin<x & year_end>x,1,0) })
答案 1 :(得分:0)
这是我设法达到的最佳解决方案。更好地描述数据会很有帮助。
以下是数据:
df<-data.frame(cbind(bank = c("bank1","bank2","bank3","bank4","bank5"),
year_begin = sample(1970:2007, 5, T),
year_end = sample(1970:2007, 5, T) ))
df$year_begin<-as.numeric(as.character(df$year_begin))
df$year_end<-as.numeric(as.character(df$year_end))
我使用两个for循环来构建变量名称和值:
构建“comp + year”列:
year<-c(1970:2007)
var<-list(length(year))
for(j in year){
var[j-1969]<-paste('comp', j)
}
填写“comp + year”列表:
for(i in 1:nrow(df)){
for(j in year){
if(df$year_begin[i] < j & df$year_end[i] > j)
{var[[j-1969]]<-c(var[[j-1969]], 1)}
else
{var[[j-1969]]<-c(var[[j-1969]], 0)}
}
}
列表到数据帧:
a<-do.call(rbind, var)
names<-a[,1]
values<-as.data.frame(t(a[,2:6]))
colnames(values)<-names
print(values) #you can cbind this to your original dataframe