2

sebastian-cの助けを借りて、私は毎日のデータに関する自分の問題を理解しました。参照してください:R ifelse状態:継続的にNAの頻度

そして今、私は毎時データを含むデータセットを持っています:

set.seed(1234)  
day <- c(rep(1:2, each=24))  
hr <- c(rep(0:23, 2))  
v <- c(rep(NA, 48))   
A <- data.frame(cbind(day, hr, v))  
A$v <- sample(c(NA, rnorm(100)), nrow(A), prob=c(0.5, rep(0.5/100, 100)), replace=TRUE)  

私がする必要があるのは、次のとおりです。さらに(> =)4つの連続して欠落している日中(7 AM-7PM)または> = 3つの連続して欠落している夜間(7PM-7AM)がある場合、データから1日全体を削除しますフレーム、それ以外の場合は線形補間を実行します。したがって、日中(7 AM-10AM)には4つの継続的なNAがあるため、2日目はデータフレームから完全に削除する必要があります。結果は、データフレームのままであることが好ましい。助けてください、ありがとう!

4

1 に答える 1

1

NA_runリンクした質問の関数を変更して、のv代わりに名前の付いた変数を取得しvalue、data.frameではなくブール値を返す場合:

NA_run <- function(x, maxlen){
  runs <- rle(is.na(x$v))
  any(runs$lengths[runs$values] >= maxlen)
}

次に、ラッパー関数を記述して、昼間と夜間に2回呼び出すことができます。

dropfun <- function(x) {
  dt <- x$hr > 7 & x$hr < 19
  daytime <- NA_run(x[dt,], 4)
  nighttime <- NA_run(x[!dt,], 3)

  any(daytime, nighttime)
}

これにより、削除する日数のdata.frameが得られます。

> ddply(A, .(day), dropfun)
  day    V1
1   1  TRUE
2   2 FALSE
> 

dropfunただし、代わりにデータフレームを返すように変更できます。

dropfun <- function(x) {
  dt <- x$hr > 7 & x$hr < 19
  daytime <- NA_run(x[dt,], 4)
  nighttime <- NA_run(x[!dt,], 3)

  if(any(daytime, nighttime)) NULL else x
}

> ddply(A, .(day), dropfun)
   day hr           v
1    2  0          NA
2    2  1          NA
3    2  2  2.54899107
4    2  3          NA
5    2  4 -0.03476039
6    2  5          NA
7    2  6  0.65658846
8    2  7  0.95949406
9    2  8          NA
10   2  9  1.08444118
11   2 10  0.95949406
12   2 11          NA
13   2 12 -1.80603126
14   2 13          NA
15   2 14          NA
16   2 15  0.97291675
17   2 16          NA
18   2 17          NA
19   2 18          NA
20   2 19 -0.29429386
21   2 20  0.87820363
22   2 21          NA
23   2 22  0.56305582
24   2 23 -0.11028549
> 
于 2012-08-17T19:23:26.697 に答える