2017-12-18 21 views
1

데이터를 세 가지 다른 기간으로 분할해야하지만 각각의 데이터에 대해 (데이터가 누락 됨) 가장 적은 수의 방식으로 데이터를 분할해야합니다. I는 제 PE 정의하면이 경우NAs 수가 가장 적은 기간으로 데이터 분할

library(lattice) 
xyplot(Data$Y ~ Data$X,, 
     panel = function(x, y) { 
     panel.xyplot(x, y) 
     panel.abline(v=c(as.Date('2017/05/01'),as.Date('2017/07/01'))) 
     }) 

enter image description here

3 개 동일 시간대에

Data <- data.frame(
    Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)), 
    X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/02'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/03'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9))) 
) 

분할 그것과 같을 것이다 다음 Y. 여기에 내 데이터 인 riod as 2017/03/01 to 2017/05/03, 2017/04/30 대신에, 나는 첫 번째 기간에 그룹 C와 E에 대해 NA를 가지지 않을 것입니다. 이것이 내가 원하는 것입니다. 2017년 5월 1일에 2017년 6월 30일 :

  • 기간이 2017년 3월 1일가 2017/04/30에 :

    • 기간 1 :

      그래서 나는 그 3 개 기간이 원하는

    • 기간 3 : 2017년 7월 1일는

    를 2017/09/30하도록하지만 그 기간의 시작/끝과가요까지 10 일이 될 수있다. 시각적으로 보는 것보다 이것을 할 수있는 방법이 있습니까?

  • +0

    당신은'runif 등의 임의의 숫자를 포함하는 샘플 데이터를 작성하는 경우()', 'rnorm()'또는'sample()'은'set.seed ()'를 사용하여 데이터를 재현성있게 만듭니다. 그렇지 않으면 분석 및 예상 결과가 다른 사용자에게 매우 다를 수있는 데이터에 따라 달라집니다. 고맙습니다. – Uwe

    답변

    1

    우리가 이동할 수있는 경계가 10 개 간격으로 하나씩 있으므로 21x21 = 441 옵션이 있습니다. 이는 무차별 적으로 충분히 작게 보입니다 (또는 이것이 단순화 된 데이터 세트이며 실제 문제가 더 커집니까?).

    Data <- data.frame(
        Y = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10)), 
        X = c(sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/02'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9)),sample(seq(as.Date('2017/03/01'), as.Date('2017/09/01'), by="day"), 10),c(as.Date('2017/05/03'),sample(seq(as.Date('2017/05/01'), as.Date('2017/09/01'), by="day"), 9))) 
    ) 
    
    split1 = as.Date('2017/05/01') 
    split2 = as.Date('2017/07/01') 
    
    library(dplyr) 
    argmin=[i,j] 
    minimum = 999 
    
    for(i in seq(-10,10)) 
    { 
        for(j in seq(-10,10)) 
        { 
        df = Data %>% group_by(Y) %>% summarize(period1 = sum(X<(split1+i)), 
                 period2 = sum(X>=(split1+i) & X<(split2+j)), 
                 period3 = sum(X>=(split2+j))) 
        if(sum(df==0)<minimum) 
        { 
         argmin = c(i,j) 
         minimum = sum(df==0) 
        } 
    
        } 
    } 
    
    cat(paste0("period 1: 2017-03-01 to ",split1+argmin[1]-1,"\n")) 
    cat(paste0("period 2: ",split1+argmin[1]," to ",split2+argmin[2]-1,"\n")) 
    cat(paste0("period 3: ",split2+argmin[2]," to 2017-09-30 \n")) 
    cat(paste0("Total NA's: ", minimum)) 
    

    출력 :

    어쨌든, 여기 당신이 원하는 않는 아주 최적 코드

    period 1: 2017-03-01 to 2017-05-03 
    period 2: 2017-05-04 to 2017-06-20 
    period 3: 2017-06-21 to 2017-09-30 
    Total NA's: 0 
    
    +1

    'runif()','rnorm()','sample()'과 같은 난수를 포함하는 샘플 데이터를 만들려면'set.seed ()'를 사용하여 데이터를 재생산하십시오. 고맙습니다. – Uwe