3

データ/時間とフローの 2 つのパラメーターを持つデータがあります。フローデータは断続的なフローです。時々ゼロの流れがあり、突然流れが始まり、しばらくの間ゼロ以外の値があり、その後流れが再びゼロになるとしましょう。ゼロ以外の値がいつ発生するか、およびゼロ以外の各フローがどれくらい続くかを理解したいです。この場所にサンプル データセットを添付しましたhttps://www.dropbox.com/s/ef1411dq4gyg0cm/sampledataflow.csv

データは1分データです。

次のようにデータをRにインポートできました。

   flow <- read.csv("sampledataflow.csv")
summary(flow)
names(flow) <- c("Date","discharge")
flow$Date <- strptime(flow$Date, format="%m/%d/%Y %H:%M")
sapply(flow,class)
plot(flow$Date, flow$discharge,type="l")

分布を確認するためにプロットを作成しましたが、ゼロ以外の各値の頻度をどこから取得し始めるべきかの手がかりを得ることができませんでした。出力テーブルを次のように表示したいと思います。

Date    Duration in Minutes

ここでわからないことがあれば教えてください。ありがとう。

追加情報:

最初にゼロ以外の値を確認してから、ゼロ以外の値が再びゼロになるまでに連続していくつあるかを調べる必要があると思います。私が理解したいのは、フローリリース期間です。たとえば。1 日に複数のリリースが行われる可能性があるため、リリースが開始された時刻と、値がゼロになるまでの期間を記録したいと思います。これで問題が少しよく説明されることを願っています。

4

2 に答える 2

3

最初のポイントは、データが多すぎるということですNA。調べてみたい方はどうぞ。私の理解が正しければ、日付ごとに、連続する 0 の後に連続する非ゼロ、ゼロ、非ゼロなどの数が必要です。

rleもちろん、コメントの下で@mnelによっても言及されているように、これは達成できます。しかし、かなりの数のキャッチがあります。

まず、NA 以外のエントリでデータを設定します。

flow <- read.csv("~/Downloads/sampledataflow.csv")
names(flow) <- c("Date","discharge")
flow <- flow[1:33119, ] # remove NA entries

# format Date to POSIXct to play nice with data.table
flow$Date <- as.POSIXct(flow$Date, format="%m/%d/%Y %H:%M")

次に、Date列を作成します。

flow$g1 <- as.Date(flow$Date)

最後に、私はdata.table. そこで、これを使った解決策です。

# load package, get data as data.table and set key
require(data.table)
flow.dt <- data.table(flow)
# set key to both "Date" and "g1" (even though, just we'll use just g1)
# to make sure that the order of rows are not changed (during sort)
setkey(flow.dt, "Date", "g1") 
# group by g1 and set data to TRUE/FALSE by equating to 0 and get rle lengths
out <- flow.dt[, list(duration = rle(discharge == 0)$lengths, 
        val = rle(discharge == 0)$values + 1), by=g1][val == 2, val := 0]

> out # just to show a few first and last entries

#              g1 duration val
#   1: 2010-05-31      120   0
#   2: 2010-06-01      722   0
#   3: 2010-06-01      138   1
#   4: 2010-06-01       32   0
#   5: 2010-06-01       79   1
#  ---                        
#  98: 2010-06-22      291   1
#  99: 2010-06-22      423   0
# 100: 2010-06-23      664   0
# 101: 2010-06-23      278   1
# 102: 2010-06-23      379   0

したがって、たとえば、 の場合2010-06-01、 722の0's後に 138non-zerosが続き、その後に 320'sが続き、その後に 79non-zerosなどが続きます...

于 2013-02-20T23:27:56.400 に答える
2

最初の2日間の小さなサンプルを見ました

> do.call( cbind,  tapply(flow$discharge, as.Date(flow$Date), function(x) table(x > 0) ) )
      2010-06-01 2010-06-02
FALSE       1223        911
TRUE         217        529    # these are the cumulative daily durations of positive flow.

これを転置したい場合、t() 関数は成功するはずです。または、rbind を使用することもできます。

フローポジティブな分数が必要な場合は、これも機能します。

 tapply(flow$discharge, as.Date(flow$Date), function(x) sum(x > 0, na.rm=TRUE)  ) 
#--------
2010-06-01 2010-06-02 2010-06-03 2010-06-04 2010-06-05 2010-06-06 2010-06-07 2010-06-08 
       217        529        417        463          0          0        263        220 
2010-06-09 2010-06-10 2010-06-11 2010-06-12 2010-06-13 2010-06-14 2010-06-15 2010-06-16 
       244        219        287        234         31        245        311        324 
2010-06-17 2010-06-18 2010-06-19 2010-06-20 2010-06-21 2010-06-22 2010-06-23 2010-06-24 
       299        305        124        129        295        296        278          0 

放電値が 0 より大きい間隔の長さを取得するには、次のようにします。

tapply(flow$discharge, as.Date(flow$Date), function(x) rle(x>0)$lengths[rle(x>0)$values]  )
#--------
$`2010-06-01`
[1] 138  79

$`2010-06-02`
[1]  95 195 239

$`2010-06-03`
[1]  57 360

$`2010-06-04`
[1]   6 457

$`2010-06-05`
integer(0)

$`2010-06-06`
integer(0)

... Snipped output

これらの期間の分布を見たい場合は、その結果を非表示にする必要があります。(そして、真夜中に分割された期間がカウントと期間に影響を与えた可能性があることを覚えておいてください。) 日付のない期間だけが必要な場合は、これを使用します。

flowrle <- rle(flow$discharge>0)
flowrle$lengths[!is.na(flowrle$values) & flowrle$values]
#----------
 [1] 138  79  95 195 296 360   6 457 263  17 203  79  80  85  30 189  17 270 127 107  31   1
[23]   2   1 241 311 229  13  82 299 305   3 121 129 295   3   2 291 278
于 2013-02-20T23:17:51.217 に答える