2016-05-16 11 views
2

カテゴリの列(0/1)に基づいて新しいID(以下のデータではid_2)を作成しようとしています。カテゴリが0の場合は、NAが必要です.1の場合は、最初の1のグループを1、2のグループを1のように繰り返す必要があります。 id_1ごとに個別に行う必要があります。繰り返し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'を 'id_1'でグループ化した 'data.table'(setDT(df1))に変換し、ラン長ID関数(rleid)を論理vectorcategory ==0 & !is.na(category))に適用し、0を ' 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

関連する問題