3

動物が5秒ごとに記録されたデータセットがいくつかあります。データはpostgisに保存されており、Rを使用してデータを分析およびプロットしています。各時間の位置を示すいくつかのマーカーをプロットに追加したいと思います。データセットのサブセットを R に取り込み、各ポイントのタイムスタンプと x および y 座標を含むデータ フレームを作成しています。

私のデータセットの summary() の一部 (合計約 10000 行):

 id             datetime                        date           
Min.   :2664295   Min.   :2009-08-21 05:00:04   Min.   :2009-08-21  
1st Qu.:2666819   1st Qu.:2009-08-21 08:30:15   1st Qu.:2009-08-21  
Median :2669342   Median :2009-08-21 12:00:03   Median :2009-08-21  
Mean   :2669342   Mean   :2009-08-21 11:30:10   Mean   :2009-08-21  
3rd Qu.:2671866   3rd Qu.:2009-08-21 14:22:44   3rd Qu.:2009-08-21  
Max.   :2674390   Max.   :2009-08-21 16:59:58   Max.   :2009-08-21  

 lokalitet             cowid           x                y          
Length:10          Min.   :553   Min.   :455329   Min.   :6712350  
Class :character   1st Qu.:553   1st Qu.:455718   1st Qu.:6712744  
Mode  :character   Median :553   Median :456154   Median :6713068  
                   Mean   :553   Mean   :456011   Mean   :6713074  
                   3rd Qu.:553   3rd Qu.:456274   3rd Qu.:6713470  
                   Max.   :553   Max.   :456361   Max.   :6713596  

したがって、私がやりたいことは、分の部分が 0 で秒の部分が < 5 である datetime のデータ セットをサブセット化することです (つまり、要約に表示されるタイムスタンプの場合、05:00:04 と 12 が必要です)。 :00:03. (postgres でこれを実行できることはわかっていますが、ベース データセットが非常に大きく (約 400 万行)、部分的なタイムスタンプでインデックスを作成していないため、 Rのサブセット)(いいえ、これを何度もやりたいので、一致する最初の行を手動で見つけて、そこから720行ごとに取得したくありません)

4

3 に答える 3

8

このlubridateパッケージを使用すると、日付から分と秒を簡単に抽出してテストできます。例えば ​​:

library(lubridate)

## Sample data
dates <- as.POSIXlt(c("2009-08-21 05:00:04","2009-08-21 08:30:15","2009-08-21 12:00:03","2009-08-21 11:30:10","2009-08-21 14:22:44","2009-08-21 16:59:58"))

## How to extract minutes
minute(dates)
# [1]  0 30  0 30 22 59

## How to extract seconds
second(dates)
# [1]  4 15  3 10 44 58

## Select dates from minutes and seconds values
dates[minute(dates)==0 & second(dates) < 5]
# [1] "2009-08-21 05:00:04" "2009-08-21 12:00:03"
于 2013-02-22T08:12:59.083 に答える
2

フォーマット文字列を受け取って数値に変換するヘルパー関数を作成できます。データタイムは POSIXlt ではなく POSIXct であると仮定します。(POSIXct は、データフレーム操作ではうまく機能しません。)

ndtfrm <- function(dt, frm) as.numeric(format(dt, frm))
ndtfrm(dates, "%M")
#[1]  0 30  0 30 22 59
ndtfrm(dates, "%S")
#[1]  4 15  3 10 44 58

 dfrm[ ndtfrm(dfrm$dates, "%M") ==0 & ndtfrm(dfrm$dates, "%S") < 5 , ]
于 2013-02-22T10:48:59.867 に答える
0

ご回答いただきありがとうございますが、postgres で行うのが最も簡単であることがわかりました...

シンプルな

SELECT ..., case when extract(second from datetime)<5 
                         and extract(minute from datetime) = 28 
  then extract(hour from datetime) end as marker  FROM ....

必要なものを提供してくれました。このデータを残りのデータセットと一緒に取得しているだけなので、それらのポイントを検索する必要はありません。

于 2013-02-25T08:06:18.510 に答える