2016-12-09 28 views
0

這裏是我的數據庫麻煩與功能環境控制流和可能分配

 PERSON_ID   EVENT 
    1 10000000001 LST_Mammo_EPI 
    2 10000000001   EPI 
    3 10000000002   BC1 
    4 10000000002   R_B 
    5 10000000002   BC2 
    6 10000000002   DEATH 
    7 10000000002   EPI 
    8 10000000004 FST_Mammo_FUP1 
    9 10000000004  OV1_FUP1 
    10 10000000004   BC1 
    11 10000000004 LST_Mammo_EPI 
    12 10000000004   EPI 
    13 10000000004  OV2_FUP1 
    14 10000000004 LST_Mammo_FUP1 
    15 10000000004   FUP1 
    16 10000000004   BC2 
    17 10000000004   FUP2 
    18 10000000005 LST_Mammo_EPI 
    19 10000000005   EPI 
    20 10000000007   BC1 
    21 10000000007   BC2 
    22 10000000007   DEATH 
    23 10000000010   DEATH 
    24 10000000826 FST_Mammo_FUP1 
    25 10000000826   BC1 
    26 10000000826   L_B 
    27 10000000826 LST_Mammo_EPI 
    28 10000000826 LST_Mammo_FUP1 
    29 10000000826   BC2 
    30 10000000826   R_B 
    31 10000000826   EPI 
    32 10000000826  OV1_FUP1 
    33 10000000826  OV2_FUP1 
    34 10000000826  OV2_FUP2 
    35 10000000826   FUP1 
    36 10000000826   FUP2 
    37 10000000827   DEATH 
    38 10000000830   BC1 
    39 10000000830   DEATH 
    40 10000000844 LST_Mammo_EPI 

所以我寫了一個函數來獲取數據的子集讓我們說具體的兩個事件之間的任何數據,每個人

node <- function(proxis, fulle, database){ 

    result <- NULL 

    for (ID in unique(database$PERSON_ID)){ 
    person <- subset(database, database$PERSON_ID == ID) 
      a <- which(person $EVENT == fulle) 

     if (length(a) == 0){ 
      next} else { 

     person <- person[c(1:a),] 
      b <- which(person$EVENT == proxis) 

      if (length(b) == 0) { 
      next} else{ 

      person <- person[c(b:a),] 
       a <- which(person$EVENT == "OV") 
       b <- which(person$EVENT == "BC1") 
       c <- which(person$EVENT == "BC2") 
      if (min(a,b,c) != 0) {next 
      }else{ 
       result <- rbind(result,person) 

       }}}} 

    result 
} 

hello <- node("BC1","BC2",test) 

但是這給了我NULL矩陣,當我沒有for循環特定的人進行測試,它正確地給了我BC1和BC2

我想someth之間的數據與結果矩陣的休息或分配錯誤... 任何人都可以提供見解?

+0

這是什麼會拋出一個錯誤的預期產出? (min(a,b,c)!= 0)改變爲if(min(長度(a),長度(b),長度(c))!!= 0)固定( – mtoto

+0

)。我需要這條線,因爲例如,當我需要BC1和BC2之間的行時,我不應該在BC1和BC2之間有事件OV。就像hello < - node(「BC1」,「BC2」,test) – jayinbluecity

回答

1

要獲得行每個PERSON_ID兩者之間的事件,我們可以創建一個功能

node <- function(data,event1, event2) { 
     do.call(rbind, lapply(unique(data$PERSON_ID), function(x) 
        data[with(data, which(PERSON_ID == x & EVENT == event1) : 
            which(PERSON_ID == x & EVENT == event2)), ])) 
} 

注:如果event1event2缺少任何PERSON_ID

+1

這樣更容易,更簡單,但是因爲我上面評論的限制,我最終使用了我的。感謝壽! – jayinbluecity