0

ループせずに次のことを行う方法を見つけようとしています。次のような、時間、調査場所、フローの溶けたデータセットがあります。

datetime サイト フロー2009 年 6 月 1
日 00:00 EBT NA 2009 年 6 月 2
日 01:00 EBT NA 2009 年 6 月 3
日 02:00 EBT 0.1 2009 年 6 月 4
日 03:00 EBT NA
2009 年 6 月 5 日 04: 00 EBT NA
6/1/2009 00:00 MUT 0.4
6/2/2009 01:00 MUT 0.3
6/3/2009 02:00 MUT 0.2
6/4/2009 03:00 MUT NA
6/5/2009 04: 00 ミュートなし

これをサイトごとにサブセット化する必要があります。次に、少なくとも 2 つの後続の流量測定がある期間について、いくつかの計算を実行する必要があります。たとえば、現在と前回の測定値の平均です。

秘訣は、連続する測定の各セットで平均を実行する必要があることです。つまり、後者の 2 つの測定のそれぞれに対して 3 つの行が連続している場合、その測定と前の測定の平均が必要です。取得したい結果を含む目標列をサンプル データフレームに追加しました。*

日時、サイト、および計算結果を含む同様のデータフレームを作成したいと思います。各サイトには完全な時系列があります。

助けてくれてありがとう!

データジェネレーター:

structure(list(datetime = structure(c(1167627600, 1167717600, 
1167807600, 1167897600, 1167987600, 1167627600, 1167717600, 1167807600, 
1167897600, 1167987600, 1168077600, 1168167600, 1168257600, 1168347600, 
1168437600), class = c("POSIXct", "POSIXt"), tzone = ""), site = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("EBT", 
"MUT"), class = "factor"), flow = c(NA, 0.1, NA, NA, NA, NA, 
0.4, 0.2, NA, NA, 0.4, 0.2, 0.1, NA, NA), goal = c(NA, NA, NA, 
NA, NA, NA, NA, 0.3, NA, NA, NA, 0.3, 0.15, NA, NA)), .Names = c("datetime", 
"site", "flow", "goal"), row.names = c(NA, -15L), class = "data.frame")
4

2 に答える 2

1

これにより、データフレームが分離されsite、次のように 2 つ以上の連続した非 NA 値を持つ行のみがフィルタリングされflowます。

by(sample, sample$site, function(d) d[with(rle(!is.na(d$flow)), rep(values & lengths>=2, lengths)),])

その後、必要に応じて内部の関数で作業して計算を行うことができます。

たとえば、平均を新しい列として追加する場合 (NA定義されていない場合に必要であると仮定)、これを使用できます。

f <- function(d)
{
    x <- with(rle(!is.na(d$flow)), rep(values & lengths>=2, lengths))

    within(d, {avg <- NA; avg[x] <- mean(d[x,"flow"])})
}

b <- by(sample, sample$site, f)

Reduce(rbind, b)

結果:

              datetime site flow avg
1  2009-06-01 01:00:00  EBT   NA  NA
2  2009-06-02 02:00:00  EBT   NA  NA
3  2009-06-03 03:00:00  EBT  0.1  NA
4  2009-06-04 04:00:00  EBT   NA  NA
5  2009-06-05 05:00:00  EBT   NA  NA
6  2009-06-01 01:00:00  MUT  0.4 0.3
7  2009-06-02 02:00:00  MUT  0.3 0.3
8  2009-06-03 03:00:00  MUT  0.2 0.3
9  2009-06-04 04:00:00  MUT   NA  NA
10 2009-06-05 05:00:00  MUT   NA  NA

編集:現在のフロー測定値と前のフロー測定値の間の平均を取得するには、これを使用できます。

f <- function(d)
{
    within(d, avg <- (flow+c(NA,head(flow,-1)))/2)
}

Reduce(rbind, by(sample, sample$site, f))

メジャーが 1 つのケースは、自動的に に設定されることに注意してくださいNA。新しい結果:

              datetime site flow goal  avg
1  2007-01-01 03:00:00  EBT   NA   NA   NA
2  2007-01-02 04:00:00  EBT  0.1   NA   NA
3  2007-01-03 05:00:00  EBT   NA   NA   NA
4  2007-01-04 06:00:00  EBT   NA   NA   NA
5  2007-01-05 07:00:00  EBT   NA   NA   NA
6  2007-01-01 03:00:00  MUT   NA   NA   NA
7  2007-01-02 04:00:00  MUT  0.4   NA   NA
8  2007-01-03 05:00:00  MUT  0.2 0.30 0.30
9  2007-01-04 06:00:00  MUT   NA   NA   NA
10 2007-01-05 07:00:00  MUT   NA   NA   NA
11 2007-01-06 08:00:00  MUT  0.4   NA   NA
12 2007-01-07 09:00:00  MUT  0.2 0.30 0.30
13 2007-01-08 10:00:00  MUT  0.1 0.15 0.15
14 2007-01-09 11:00:00  MUT   NA   NA   NA
15 2007-01-10 12:00:00  MUT   NA   NA   NA
于 2013-07-29T19:00:05.370 に答える