2015-12-15 47 views
0

我正在做一個大數據樣本的序列分析。我想要做的是在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聲明,以便它停止在單個項目上(從減去,A2,從A2等)。

2)第二種情況是更復雜一點點,但本質上是如上所述的相同的情況下:

M2_2R_A_1(開始)M2_3R_A_1(結束)表示的年的日期,其中一個教育活動發生地點。我想生成1948年:2013年變量,表明某個活動發生在特定年份(stedu==x)。我的塔塔代碼的一部分如下(它繼續這樣,截至2013年):

recode stedu1948(0=2) if M2_2R_A_1<=1948 & 1948<= M2_3R_A_1 | M2_2R_A_2<=1948 & 1948<= M2_3R_A_2 | M2_2R_A_3<=1948 & 1948<= M2_3R_A_3 
recode stedu1949(0=2) if M2_2R_A_1<=1949 & 1949<= M2_3R_A_1 | M2_2R_A_2<=1949 & 1949<= M2_3R_A_2 | M2_2R_A_3<=1949 & 1949<= M2_3R_A_3 
recode stedu1950(0=2) if M2_2R_A_1<=1950 & 1950<= M2_3R_A_1 | M2_2R_A_2<=1950 & 1950<= M2_3R_A_2 | M2_2R_A_3<=1950 & 1950<= M2_3R_A_3 

因此,爲了寫一個循環我還需要包括爲了在停止循環的一些條件給定點。

+1

這不只是'DT [DUR] < - DT [DB2] - DT [DB1]'?這種操作很少需要循環。 – thelatemail

+0

謝謝:)該操作給出了一個列表,但它對第一個循環很有效 – Mateusz

回答

0

對於您的第一個項目,請使用@thelatemail的建議。對於第二個項目,使用ifelse()功能考慮以下for循環:

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)]] 
}