2017-02-19 12 views
4

の値の最初の出現を検索し(0〜1)、i = 1からあたりの値の最初の出現を見つけたいです。私が持っていると思い何R:私は日付時刻と値とのdata.frameを有する毎日

df <- read.table(header = TRUE, text = ' 
Datetime     Value 
"2016-12-01 23:45:00"  0 
"2016-12-01 23:50:00"  1 
"2016-12-02 00:05:00"  1 
"2016-12-02 00:10:00"  0 
"2016-12-03 04:10:00"  0 
"2016-12-03 04:15:00"  0 
"2016-12-04 12:10:00"  1 
"2016-12-04 12:15:00"  1 
') 
df$Datetime <- as.POSIXct(df$Datetime, "%Y-%m-%d %H:%M:%S", tz="UTC") 
View(df) 

は次のとおりです。

2016-12-01 23:50:00  1 
2016-12-02 00:05:00  1 
2016-12-04 12:10:00  1 

私は試合での問題を(解決しようとした)及び(集約)が、これまでのところ、運がなかったです。さらに、私はforループで問題を解決することができましたが、それはa)非常に遅く、b)おそらくそれが意図されている方法ではありませんでした。

答えて

2
df[!duplicated(paste0(as.Date(df$Datetime), df$Value)) & df$Value == 1, ] 
#    Datetime Value 
# 2 2016-12-01 23:50:00  1 
# 3 2016-12-02 00:05:00  1 
# 7 2016-12-04 12:10:00  1 

説明:

作成日付(as.Date) - paste0を使用して値の組み合わせ。前の要素(duplicated)の重複(!)でない組み合わせを示す論理ベクトルを作成し、 '値'が1の場合はテストと結合します(& df$Value == 1)。

4

すべての行をValue==1で区切ることができます。もちろん、これらの最初のものが含まれている必要があります。最初の行の後に、値が== 1の前の行の日と等しくない場合にのみ、行が含まれます。

Ones = df[df$Value == 1,] 
DayChange = c(1, which(diff(as.Date(Ones$Datetime)) > 0)+1) 
Ones[DayChange,] 
      Datetime Value 
2 2016-12-01 23:50:00  1 
3 2016-12-02 00:05:00  1 
7 2016-12-04 12:10:00  1 
3

dplyrと代替:

library(dplyr) 
df %>% 
#group 
group_by(as.Date(Datetime)) %>% 
#select only those where value equals 1 
filter(Value == 1) %>% 
#get only the first row 
slice(1) %>% 
#ungroup 
ungroup %>% 
#select columns 
select(Datetime, Value) 

出力リレー:

# A tibble: 3 x 2 
      Datetime Value 
       <time> <int> 
1 2016-12-01 23:50:00  1 
2 2016-12-02 00:05:00  1 
3 2016-12-04 12:10:00  1 

それとも@Akrunのコメントのとおり:

df %>% 
    group_by(Date = as.Date(Datetime)) %>% 
    slice(which(Value==1)[1]) 
+0

サブセット((値== 1)[1]) ' – akrun

+1

@akrunありがとうございました。良いですね! – LyzandeR

1

data.tableを使用したオプションです。 'datetime'をDateに変換してグループ化し、 'i'をValue==1と指定してグループ化した 'data.frame'を 'data.table'(setDT(df))に変換し、最初に1(.I[1])のインデックスを取得し、それを使用します私は1つのステップは `DF%>%GROUP_BY(日= as.Date(日時))%>%スライスに減少させることができると思う行

library(data.table) 
setDT(df)[df[Value==1, .I[1], .(as.Date(Datetime))]$V1] 
#    Datetime Value 
#1: 2016-12-01 23:50:00  1 
#2: 2016-12-02 00:05:00  1 
#3: 2016-12-04 12:10:00  1