用于顺序重新编码的嵌套循环

时间:2015-12-15 22:42:10

标签: r loops stata

我正在对大数据样本进行序列分析。我想要做的是在R中重写我的旧Stata代码,以便我的所有分析都在一个单独的环境中执行。

但是,我还想稍微改进一下 - 代码很长,我想用循环重写它,以便它变得更具可读性。不幸的是,我的循环写作技巧值得怀疑。

第一个循环[我认为它需要包含一个if语句]

我想为以下命令编写一个循环:

dt$dur.ofA1 <-(dt$M2_3R_A_1 - dt$M2_2R_A_1)
dt$dur.ofB1<-(dt$M2_3R_B_1 - dt$M2_2R_B_1)
dt$dur.ofC1<-(dt$M2_3R_C_1 - dt$M2_2R_C_1)
dt$dur.ofD1<-(dt$M2_3R_D_1 - dt$M2_2R_D_1)
dt$dur.ofE1<-(dt$M2_3R_E_1 - dt$M2_2R_E_1)
dt$dur.ofF1<-(dt$M2_3R_F_1 - dt$M2_2R_F_1)
dt$dur.ofG1<-(dt$M2_3R_G_1 - dt$M2_2R_G_1)
dt$dur.ofH1<-(dt$M2_3R_H_1 - dt$M2_2R_H_1)
dt$dur.ofA2<-(dt$M2_3R_A_2 - dt$M2_2R_A_2)
dt$dur.ofB2<-(dt$M2_3R_B_2 - dt$M2_2R_B_2)
dt$dur.ofC2<-(dt$M2_3R_C_2 - dt$M2_2R_C_2)
dt$dur.ofD2<-(dt$M2_3R_D_2 - dt$M2_2R_D_2)
dt$dur.ofE2<-(dt$M2_3R_E_2 - dt$M2_2R_E_2)
dt$dur.ofF2<-(dt$M2_3R_F_2 - dt$M2_2R_F_2)
dt$dur.ofG2<-(dt$M2_3R_G_2 - dt$M2_2R_G_2)
dt$dur.ofH2<-(dt$M2_3R_H_2 - dt$M2_2R_H_2)
dt$dur.ofA3<-(dt$M2_3R_A_3 - dt$M2_2R_A_3)
dt$dur.ofB3<-(dt$M2_3R_B_3 - dt$M2_2R_B_3)
dt$dur.ofC3<-(dt$M2_3R_C_3 - dt$M2_2R_C_3)
dt$dur.ofD3<-(dt$M2_3R_D_3 - dt$M2_2R_D_3)
dt$dur.ofE3<-(dt$M2_3R_E_3 - dt$M2_2R_E_3)
dt$dur.ofF3<-(dt$M2_3R_F_3 - dt$M2_2R_F_3)
dt$dur.ofG3<-(dt$M2_3R_G_3 - dt$M2_2R_G_3)
dt$dur.ofH3<-(dt$M2_3R_H_3 - dt$M2_2R_H_3)

我的尝试:

db1 <- paste(rep("M2_", 24), "2R_", rep(LETTERS[seq( from = 1, to = 8)],3), "_",
            rep(seq(from=1, to =3), 8),
            sep = "")
db2 <- paste(rep("M2_", 24), "3R_", rep(LETTERS[seq( from = 1, to = 8)],3), "_",
             rep(seq(from=1, to =3), 8),
             sep = "")
dur <- paste(rep("dur.of", 24), rep(LETTERS[seq( from = 1, to = 8)],3),
             rep(seq(from=1, to =3), 8),
             sep = "")

dur <- as.list(dur)

for(e in dur){
  for (j in db1){
    for (i in db2){
  {
  dt[,e] <- dt[,i] - dt[,j]
}

我认为循环在中间需要if语句,因此它会停留在单个项目上(从A1减去A1,从{{1}减去A2等等。从列表中。

2)第二种情况稍微复杂一些,但基本上与上述情况相同:

A2(开始)M2_2R_A_1(完成)表示教育活动发生的年度日期。我想生成1948:2013变量,表明某个活动发生在特定年份(M2_3R_A_1)。我的Stata代码的一部分如下(它持续到2013年):

stedu==x

因此,为了编写循环,我还需要包含一些条件以便在给定点停止循环。

1 个答案:

答案 0 :(得分:0)

对于您的第一项,请使用@ thelatemail的建议。对于第二项,请使用for函数考虑以下ifelse()循环:

for (i in 1948:2013) {
    dt[[paste0("stedu", i)]] <- ifelse((dt$M2_2R_A_1 <= i & dt$M2_3R_A_1 >= i) OR  
                                       (dt$M2_2R_A_2 <= i & dt$M2_3R_A_2 >= i) OR
                                       (dt$M2_2R_A_3 <= i & dt$M2_3R_A_3 >= i),                 
                                       2,                               
                                       dt[[paste0("stedu", i)]]  
}