使用循环创建变量或在r中应用

时间:2016-02-16 18:23:13

标签: r for-loop stata sapply

我试图根据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年开始运作。

提前感谢您的帮助!

2 个答案:

答案 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