2017-02-19 83 views
4

的值第一次出現我有日期時間和值的data.frame(0和1之間),我想找到的值的第一次出現 = 1 天。R:查找每個

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

我認爲一個步驟可以與'DF%>%GROUP_BY(日期= as.Date(日期時間))%>%切片被減小(其(值== 1)[1]) ' – akrun

+1

非常感謝@akrun。好一個! – LyzandeR

1

以下是使用data.table的選項。將'data.frame'轉換爲'data.table'(setDT(df)),通過將'Datetime'轉換爲Date進行分組,將'i'指定爲Value==1,我們得到第一次出現的索引(.I[1]),並使用到子集的行

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