在R vs Stata中解析变量名

时间:2016-02-16 18:04:34

标签: r loops parsing stata

我有一个变量名称系列,只在最后四个位置(年份)发生变化,我想一次创建解决该系列的变量。

在Stata我会这样做:

forvalues n=1991(1)1995 {
gen comp`n’== (year_begin<`n’ & (year_end>`n’ | year_end==.))
}

以下是我在R中所做的事情:

data$comp1991<-ifelse(year(data$date_begin)<1991 & (year(data$date_end)>1991|is.na(data$date_end)),1,0)

data$comp1992<-ifelse(year(data$date_begin)<1992 & (year(data$date_end)>1992|is.na(data$date_end)),1,0)

data$comp1993<-ifelse(year(data$date_begin)<1993 & (year(data$date_end)>1993|is.na(data$date_end)),1,0)

data$comp1994<-ifelse(year(data$date_begin)<1994 & (year(data$date_end)>1994|is.na(data$date_end)),1,0)

data$comp1995<-ifelse(year(data$date_begin)<1995 & (year(data$date_end)>1995|is.na(data$date_end)),1,0)

所以在Stata中,我只有一行代码,而在R中,我需要一遍又一遍地重复这一行,手动改变`n'。

有没有办法在R中更有效地做到这一点? (我正在考虑循环与eval(parse())的某种组合,但不确定。任何想法都将受到赞赏:

1 个答案:

答案 0 :(得分:1)

要详细说明一些评论,最接近你提供的Stata循环的等价物是:

for(n in seq(1991, 1995)) {
    data[[paste0('comp', n)]] <- year(data$date_begin)<1991 & (year(data$date_end)>1991 | is.na(data$date_end))
}

条件语句将在Stata中返回0和1,但在R中返回FALSE和TRUE。但两者之间没有实际区别;你仍然可以对它们进行相同的操作。

如果你想使循环甚至更多类似于Stata代码,你可以使用data清理对象data.table的一些重复引用。包:

library(data.table)
data <- data.table(data)
for(n in seq(1991, 1995)) {
    data[, paste0('comp',n) := year(date_begin)<1991 & (year(date_end)>1991 | is.na(date_end)]
}