2017-05-21 2 views
0

私は2つの変数間の時間差を要約し、リストの長さを見つけようとしました。特定の間隔によるカットポイント

私のデータセットは次のようになっています。彼らのギャップが6:00よりも小さい階段を手に入れたい。

Group Time1 Gap 
A 11:00:00 AM 
A 11:04:00 AM 4:00 
A 11:06:00 AM 2:00 
A 11:08:00 AM 2:00 
A 11:12:00 AM 4:00 
A 11:19:00 AM 7:00 
A 11:26:00 AM 7:00 
A 11:28:00 AM 2:00 
A 11:30:00 AM 2:00 
A 11:32:00 AM 2:00 
A 11:34:00 AM 2:00 
A 11:36:00 AM 2:00 

最終結果は次のようになります。

Group Gap Step 
    A 12:00 4 

インターバルが6:00より大きい場合、他のステップをカウントし続けたくありません。

フィルターオプション "...%>%filter(gap < 8:00)%>%..."を使用しましたが、機能しませんでした。私はカットポイントがこのリストを2つの別々の部分に分割することを理解しています。

サンプルDF:

structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor"), Time1 = structure(1:12, .Label = c("11:00:00 AM", 
"11:04:00 AM", "11:06:00 AM", "11:08:00 AM", "11:12:00 AM", "11:19:00 AM", 
"11:26:00 AM", "11:28:00 AM", "11:30:00 AM", "11:32:00 AM", "11:34:00 AM", 
"11:36:00 AM"), class = "factor"), Gap = structure(c(1L, 3L, 
2L, 2L, 3L, 4L, 4L, 2L, 2L, 2L, 2L, 2L), .Label = c("", "2:00", 
"4:00", "7:00"), class = "factor")), .Names = c("Group", "Time1", 
"Gap"), class = "data.frame", row.names = c(NA, -12L)) 
+0

を経由して私はまた、これらの5つのステップで合計時間ギャップ時間を見つける必要があります。私の例では、合計時間間隔は第5のギャップ値と同じです! – eabanoz

答えて

2

別の方法dplyr

library(dplyr) 

df %>% 
    mutate(Time1 = as.POSIXct(Time1, format = '%H:%M:%S'), step = row_number()-1) %>% 
    filter(Time1 - lag(Time1) > 6) 

# Group    Time1 Gap step 
#1  A 2017-05-21 11:24:00 12:00 5 
+1

'base R'オプションは' df < - transform(df、Time1 = as.POSIXct(Time1、format = '%H:%M:%S')、step = seq_len(nrow(df)))です。 サブセット(df、diff(Time1)> 6) ' – akrun

+0

アドバイス@Sotos。実際には、私は実際のデータフレームにほぼ同じスクリプトを使用していましたが、結果は間違っていました。私の拡張データフレームとスクリプトはここにありますhttp://stackoverflow.com/questions/43310503/dplyr-lag-and-difftime-give-wrong-results – eabanoz

2

まず、あなただけの行数マイナス1である「ステップ」欄を作成する必要があります。

a %>% 
    mutate(Step=row_number()-1) %>% 

次に、コロンを削除して、指定した文字列から時間を抽出する必要があります。 Str_replaceは"6:00"よりも長い時間に相当する隙間が600よりも大きい場合のみを、維持、library(stringr)

mutate(gap = as.numeric(str_replace(Gap, ":", ""))) %>% 

フィルタです。

filter(gap > 600) %>% 

次に、グループ、ギャップ、およびステップのみを保持します。

select(Group, Gap, Step) 

あなたの最終的な出力:

> df1 %>% 
+ mutate(Step=row_number()-1) %>% 
+ mutate(gap=as.numeric(str_replace(Gap, ":", ""))) %>% 
+ filter(gap > 600) %>% 
+ select(Group, Gap, Step) 

    Group Gap Step 
1  A 12:00 5 
+0

また、gapをdifftimeオブジェクトの 'gap = as.difftime(as.character(Gap)、format ="%M:%S ")'として定義することもできます。 – Lamia

+0

アドバイスありがとうございます@ConCave。私はあなたの方法を実装しようとしましたが、私はそれを得ることができませんでした。データフレームとスクリプトを拡張するには、このリンクを確認してください。http://stackoverflow.com/questions/43310503/dplyr-lag-and-difftime-give-wrong-results – eabanoz

関連する問題