2017-02-19 97 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