控制流程出现问题,可能在功能环境中进行分配

时间:2016-12-09 09:44:42

标签: r

这是我的数据库

        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之间的数据

我认为中断或分配结果矩阵有问题... 任何人都可以提供见解吗?

1 个答案:

答案 0 :(得分: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)), ]))
}

注意:如果任何event1

缺少event2PERSON_ID,则会出错