2017-09-25 5 views
5

私は1台の自転車の軌道のサンプルデータセットを持っています。次のレコードのインデックス

test[order(test$starttime, decreasing = FALSE),] 

と見つける:私の目標は、平均で、駅への訪問の間で経過B.

はこれまでのところ、私は単純にデータセットを注文することができた時間の量を把握することです私はトラブルに実行する場所どこstart_stationend_station等しいB.

which(test$start_station == 'B') 
which(test$end_station == 'B') 

の行インデックスは次の部分です。自転車は駅Bであるときの間で経過は、我々はレコードがであることを起こるend_station= "B"でも場合、レコードを発生隣どこstart_station = "B"(自転車の葉)とdifftime()を取る必要があり、時間を計算するために、同じ行(行6を参照)。以下のデータセットを使用し

、我々は自転車は、ステーションBの外側7:30:0016:00:00間局Bの18:00:0018:30:00外部との間の30分510分を費やし、ステーションBの19:00:0022:30:00外部との間の210分間、そのことを知っています平均を250 minutes.

difftime()を使用してRでこの出力を再現するにはどうすればよいですか?ここで

> test 
    bikeid start_station   starttime end_station    endtime 
1  1    A 2017-09-25 01:00:00   B 2017-09-25 01:30:00 
2  1    B 2017-09-25 07:30:00   C 2017-09-25 08:00:00 
3  1    C 2017-09-25 10:00:00   A 2017-09-25 10:30:00 
4  1    A 2017-09-25 13:00:00   C 2017-09-25 13:30:00 
5  1    C 2017-09-25 15:30:00   B 2017-09-25 16:00:00 
6  1    B 2017-09-25 18:00:00   B 2017-09-25 18:30:00 
7  1    B 2017-09-25 19:00:00   A 2017-09-25 19:30:00 
8  1    А 2017-09-25 20:00:00   C 2017-09-25 20:30:00 
9  1    C 2017-09-25 22:00:00   B 2017-09-25 22:30:00 
10  1    B 2017-09-25 23:00:00   C 2017-09-25 23:30:00 

サンプルデータです:

> dput(test) 
structure(list(bikeid = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), start_station = c("A", 
"B", "C", "A", "C", "B", "B", "А", "C", "B"), starttime = structure(c(1506315600, 
1506339000, 1506348000, 1506358800, 1506367800, 1506376800, 1506380400, 
1506384000, 1506391200, 1506394800), class = c("POSIXct", "POSIXt" 
), tzone = ""), end_station = c("B", "C", "A", "C", "B", "B", 
"A", "C", "B", "C"), endtime = structure(c(1506317400, 1506340800, 
1506349800, 1506360600, 1506369600, 1506378600, 1506382200, 1506385800, 
1506393000, 1506396600), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("bikeid", 
"start_station", "starttime", "end_station", "endtime"), row.names = c(NA, 
-10L), class = "data.frame") 
+2

最初のステップは、 'library(data.table);のような長い形式に変換します。 variable.name = "イベント"、value.name = c( "ステーション"、 "時刻")、mtest = melt(setDT(test)、id = "bikeid"、meas = )); (イベント)、イベント:= i.V2]; mtest [。(factor(1:2)、c( "start"、 "end"))、on =。 setkey(mtest、bikeid、time) '、しかし、私はそれ以降の最善の方法はわかりません。 – Frank

答えて

1

これは、それが発生したために尋ねたとして差異を計算しますが、計算するにはdata.frame

lapply(df1$starttime[df1$start_station == "B"], function(x, et) difftime(et[x < et][1], x, units = "mins"), et = df1$endtime[df1$end_station == "B"]) 

[[1]] 
Time difference of 510 mins 

[[2]] 
Time difference of 30 mins 

[[3]] 
Time difference of 210 mins 

[[4]] 
Time difference of NA mins 

に追加していません平均時間:

v1 <- sapply(df1$starttime[df1$start_station == "B"], function(x, et) difftime(et[x < et][1], x, units = "mins"), et = df1$endtime[df1$end_station == "B"]) 
mean(v1, na.rm = TRUE) 

[1] 250 
+0

ありがとう、このメソッドは動作します。 'function(x、et)'の仕組みを簡単に説明できますか? –

+0

'lapply'は、複数の引数を関数に渡すことを許可します。 'x'の値は' starttime'であり、 'et'は関数の後に定義される追加のパラメータです。これは、パラメータが一度だけ定義されるようにするためですが、関数内で2回使用できます。 – manotheshark

1

別の可能性:

library(data.table) 
d <- setDT(test)[ , { 
    start = starttime[start_station == "B"] 
    end = endtime[end_station == "B"] 
    .(start = start, end = end, duration = difftime(end, start, units = "min")) 
} 
, by = .(trip = cumsum(start_station == "B"))] 
d 
# trip    start     end duration 
# 1: 0    <NA> 2017-09-25 01:30:00 NA mins 
# 2: 1 2017-09-25 07:30:00 2017-09-25 16:00:00 510 mins 
# 3: 2 2017-09-25 18:00:00 2017-09-25 18:30:00 30 mins 
# 4: 3 2017-09-25 19:00:00 2017-09-25 22:30:00 210 mins 
# 5: 4 2017-09-25 23:00:00    <NA> NA mins 


d[ , mean(duration, na.rm = TRUE)] 
# Time difference of 250 mins 

# or 
d[ , mean(as.integer(duration), na.rm = TRUE)] 
# [1] 250 

データを1バイクが「B」(by = cumsum(start_station == "B"))から起動するたびに増加するカウンタによってグループ化されます。

関連する問題