2016-05-16 62 views
2

我試圖根據類別列(0/1)創建一個新的ID(下面的數據中的id_2)。如果類別爲0,我只需要一個NA,如果這是1,那麼我需要對第一組「1」重複1,然後對第二組「1」重複2,依此類推。我需要爲每個id_1單獨執行此操作。For循環創建一個重複ID塊的序列

下面是我的數據的一個例子,我嘗試這樣做和輸出。 我也嘗試在函數中包含一個while循環,但這沒有幫助。

任何幫助將不勝感激。

  • 我的數據

    id_1 category id_2 
        1 NA NA 
        1 1 1 
        1 1 1 
        1 1 1 
        1 1 1 
        1 0 NA 
        1 1 2 
        1 1 2 
        1 1 2 
        1 0 NA 
        1 0 NA 
        1 1 3 
        1 1 3 
        1 1 3 
        1 0 NA 
        2 0 NA 
        2 1 1 
        2 1 1 
        2 0 NA 
        2 0 NA 
        2 0 NA 
        2 1 2 
        2 1 2 
        2 1 2 
        2 1 2 
        3 1 1 
        3 1 1 
        3 1 1 
        3 1 1 
        3 0 NA 
        3 1 2 
        3 1 2 
        3 0 NA 
        3 0 NA 
        3 1 3 
        3 1 3 
        4 0 NA 
        4 1 1 
        4 1 1 
        4 1 1 
        4 0 NA 
        5 1 1 
        5 1 1 
        5 1 1 
    
  • 我的代碼

    my_function <- function(df){ 
    out <- vector() 
    out_2 <- list() 
    for(k in unique(df$id_1)){ 
    dat <- df[df$id_1 == k,] 
    i <- 0 
    #while(i <= dim(dat)[1]){ 
        i <- i+1 
    for(j in 3: dim(dat)[1]-1){ 
        out[j] <- (ifelse(dat[j-1, 2] == 1, 
             ifelse(dat[j, 2] == 1, i, NA), # yes 1st  ifelse() 
             ifelse(dat[j, 2] == 1, i+1, NA))) # no 1st ifelse() 
        out_2[[k]] <- out 
        } 
    #} 
    } 
    return(out_2) 
    } 
    
  • 輸出

    #[[1]] 
    #[1] NA NA 1 1 1 NA 2 1 1 NA NA 2 1 1 
    
    #[[2]] 
    #[1] NA 2 1 NA NA NA 2 1 1 NA NA 2 1 1 
    
    #[[3]] 
    #[1] NA 1 1 1 NA 2 1 NA NA 2 NA 2 1 1 
    
    #[[4]] 
    #[1] NA 2 1 1 NA 2 1 NA NA 2 NA 2 1 1 
    
    #[[5]] 
    # [1] NA 1 1 1 NA 2 1 NA NA 2 NA 2 1 1 
    
+0

我想'id_1'4和5的值應該是1. – akrun

+0

是的,你是對的@akrun。現在糾正了。謝謝。 – Rafael

回答

3

我們可以使用data.table。將'data.frame'轉換爲'data.table'(setDT(df1)),按'id_1'分組,我們將運行長度id函數(rleid)應用於邏輯vectorcategory ==0 & !is.na(category)),將0'轉換爲NA NA^(!i1)*i1)),然後將其更改爲factor並獲取numeric編碼,將其分配(:=)爲'id_new'列。

library(data.table) 
setDT(df1)[, id_new := { 
     i1 <- category*rleid(category==0 & !is.na(category)) 
     as.numeric(factor(NA^(!i1)*i1))}, 
     by = id_1] 
df1 
# id_1 category id_2 id_new 
# 1: 1  NA NA  NA 
# 2: 1  1 1  1 
# 3: 1  1 1  1 
# 4: 1  1 1  1 
# 5: 1  1 1  1 
# 6: 1  0 NA  NA 
# 7: 1  1 2  2 
# 8: 1  1 2  2 
# 9: 1  1 2  2 
#10: 1  0 NA  NA 
#11: 1  0 NA  NA 
#12: 1  1 3  3 
#13: 1  1 3  3 
#14: 1  1 3  3 
#15: 1  0 NA  NA 
#16: 2  0 NA  NA 
#17: 2  1 1  1 
#18: 2  1 1  1 
#19: 2  0 NA  NA 
#20: 2  0 NA  NA 
#21: 2  0 NA  NA 
#22: 2  1 2  2 
#23: 2  1 2  2 
#24: 2  1 2  2 
#25: 2  1 2  2 
#26: 3  1 1  1 
#27: 3  1 1  1 
#28: 3  1 1  1 
#29: 3  1 1  1 
#30: 3  0 NA  NA 
#31: 3  1 2  2 
#32: 3  1 2  2 
#33: 3  0 NA  NA 
#34: 3  0 NA  NA 
#35: 3  1 3  3 
#36: 3  1 3  3 
#37: 4  0 NA  NA 
#38: 4  1 1  1 
#39: 4  1 1  1 
#40: 4  1 1  1 
#41: 4  0 NA  NA 
#42: 5  1 1  1 
#43: 5  1 1  1 
#44: 5  1 1  1 
+0

太棒了!這工作完美,只需要幾行。我想這裏的關鍵函數是setDT()和rleid(),但我還需要了解as.numeric()函數內部的語法。非常感謝@akrun – Rafael

+0

@Rafael謝謝,我會更新一些描述 – akrun

+1

太棒了!感謝@akrun的描述,這非常有幫助。 – Rafael