0

Rでデータセット(以下のサブサンプル)をクリーンアップしようとしています

if関数を介してかどうかを知ることができる限り説明する最良の方法:

航空写真 = 1 の場合、このタイム スタンプの 5 分前に別の観測があったか? もしそうなら、真/偽を与えてください

ただし、これについてどうすればよいかわかりません

               Date.Time Aerial
794  2012-10-01 08:18:00      1
795  2012-10-01 08:34:00      1
796  2012-10-01 08:39:00      1
797  2012-10-01 08:42:00      1
798  2012-10-01 08:48:00      1
799  2012-10-01 08:54:00      1
800  2012-10-01 08:58:00      1
801  2012-10-01 09:04:00      1
802  2012-10-01 09:05:00      1
803  2012-10-01 09:11:00      1
1576 2012-10-01 09:17:00      2
1577 2012-10-01 09:18:00      2
804  2012-10-01 09:19:00      1
805  2012-10-01 09:20:00      1
1580 2012-10-01 09:21:00      2
1581 2012-10-01 09:23:00      2
806  2012-10-01 09:25:00      1
807  2012-10-01 09:32:00      1
808  2012-10-01 09:37:00      1
809  2012-10-01 09:43:00      1

たとえば、09:19 の航空写真 = 1 で、この 5 分前に 09:18 と 09:17 に観測があるため、09:19 の観測を削除したいと考えています。これは大規模なデータセットであるため、複数回発生する可能性があります

Rに比較的慣れていないため、これが正しい質問方法ではない場合はお詫び申し上げます。

私のアイデア:

if.else ステートメントを使用しますが、これで動作する日時を取得できません。

上でこれを尋ねる前に、それをやろうとして円を描いて回っていたようなコードを持っていないでください

4

3 に答える 3

0
 with( dfrm, Aerial == 1 & c(diff(Date.Time),0) > 5 )
 [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE
[12] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE

それは実際には違いの1つの方向を扱っているだけであり、とにかく、最後のアイテムを含めるかどうかは未解決の問題です。両方向でそれを実行したい場合は、&作業中の追加の論理句rev( diff (rev (Date.Time) ) )が適切に設定される可能性があります。私はそれがdiff.POSIXtが数分または数秒を返していたのだろうかと思ったことを認めます。ヘルプページは役に立ちません。テストの結果、数分で表示されます。

後方差分を取得するもう1つの方法は、diff-vectorを逆にシフトしてテストすることです。

with( dfrm,  c( FALSE, abs(diff(Date.Time)) > 5 ) )
于 2013-01-10T18:13:09.140 に答える
0
d<-read.table(text='Date.Time Aerial
794  "2012-10-01 08:18:00"      1
795  "2012-10-01 08:34:00"      1
796  "2012-10-01 08:39:00"      1
797  "2012-10-01 08:42:00"      1
798  "2012-10-01 08:48:00"      1
799  "2012-10-01 08:54:00"      1
800  "2012-10-01 08:58:00"      1
801  "2012-10-01 09:04:00"      1
802  "2012-10-01 09:05:00"      1
803  "2012-10-01 09:11:00"      1
1576 "2012-10-01 09:17:00"      2
1577 "2012-10-01 09:18:00"      2
804  "2012-10-01 09:19:00"      1
805  "2012-10-01 09:20:00"      1
1580 "2012-10-01 09:21:00"      2
1581 "2012-10-01 09:23:00"      2
806  "2012-10-01 09:25:00"      1
807  "2012-10-01 09:32:00"      1
808  "2012-10-01 09:37:00"      1
809  "2012-10-01 09:43:00"      1', header=TRUE, stringsAsFactors=FALSE, row.names=1)

# convert Date.Time to POSIXct
d<-within(d, Date.Time<-as.POSIXct(Date.Time))


# define row aggregator 
f <- function(accumulation, next.row, min.mins=5) {
    last.dtime <- tail(accumulation,1)$Date.Time
    next.dtime <- next.row$Date.Time
    # don't add next.row if Aerial is 1 and time between last record is less than min.mins
    if (next.row$Aerial == 1 & (as.numeric(next.dtime - last.dtime, units='mins') < min.mins))
        accumulation
    else
        rbind(accumulation, next.row)
}

# aggregate rows
Reduce(f, split(d[order(d$Date.Time), ], sequence(nrow(d))))

#                Date.Time Aerial
# 794  2012-10-01 08:18:00      1
# 795  2012-10-01 08:34:00      1
# 796  2012-10-01 08:39:00      1
# 798  2012-10-01 08:48:00      1
# 799  2012-10-01 08:54:00      1
# 801  2012-10-01 09:04:00      1
# 803  2012-10-01 09:11:00      1
# 1576 2012-10-01 09:17:00      2
# 1581 2012-10-01 09:23:00      2
# 807  2012-10-01 09:32:00      1
# 808  2012-10-01 09:37:00      1
# 809  2012-10-01 09:43:00      1
于 2013-01-10T18:28:29.373 に答える
0

diffデータの特定の列の「実行中の差」が得られます。実行した場合diffDate.Timeまたはas.POSIXct(Date.Time)まだその形式になっていない場合)、連続する各間隔の違いがわかります。だから、の結果を見てください

diff(DataFrame$Date.Time) #or
diff(as.POSIXct(DataFrame$Date.Time)) #if the first one doesn't work

@AriBFriedman が述べたように、パッケージを使用してbase関数から離れても問題ない場合は、さらに一歩進んで、ローリング値に基づいて関数を適用できます (パッケージの一部です)。rollapplydiffzoo

于 2013-01-10T18:07:50.583 に答える