【问题标题】:creating variables using loop or apply in r使用循环创建变量或在 r 中应用
【发布时间】:2016-02-16 18:23:12
【问题描述】:

我正在尝试基于 ifelse 函数在 R 中创建一系列变量:

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)

我在 1970-2007 年间一直这样做。现在,我每年只有一条线。

在 stata 中,我可以通过以下方式做到这一点:

forvalues n=1970(1)2007 {

gen comp\`n'== (year_begin<\`n' & year_end>\`n')

}

R 中是否有类似的简单方法可以做到这一点?我知道for 循环不是很好。也许使用应用?

如果银行分行在第 n 年存在,则创建一个 dummy = 1,否则为 0(因此,如果银行分行在第 n 年之前成立并且在第 n 年之后关闭),这意味着它是在第 n 年运营。

提前感谢您的帮助!

【问题讨论】:

  • 一个更好的问题是您为什么要这样做?这似乎很奇怪
  • 为两个不同用户连续出现的几乎相同的问题提供解释也很有帮助:stackoverflow.com/q/35439914/324364
  • 看起来您正在将数据“分区”成块,但我不明白您为什么要这样做。您能否为数据块添加所需的处理逻辑,以便我们找到更好的解决方案(*应用函数等)?

标签: r for-loop stata sapply


【解决方案1】:

试试:

 sapply(1970:2007,function(x){ ifelse(year_begin<x & year_end>x,1,0) })

【讨论】:

  • 当需要二进制结果时,as.integer(year_begin &lt; x &amp; year_end &gt; x) 将比ifelse() 高效得多(只是逻辑向量的整数值)。
  • 太棒了,谢谢!!!!这做到了。最终代码如下所示: yearsx|is.na(bankall$date_end)))})) yeardumnames
【解决方案2】:

根据我对问题的理解,这是我设法达到的最佳解决方案。更好地描述数据会有所帮助。

这是数据:

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

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多