2017-12-18 17 views
1

データを3つの異なる期間に分割する必要がありますが、それぞれのデータのギャップ(欠落データ)が最小限になるようにしたい私が最初に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日:

  • 期間2 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単位の間隔内にそれぞれ2つの境界があるので、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

    関連する問題