Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于多个筛选条件(R、dplyr)创建时间戳列_R_Dplyr_Lubridate - Fatal编程技术网

基于多个筛选条件(R、dplyr)创建时间戳列

基于多个筛选条件(R、dplyr)创建时间戳列,r,dplyr,lubridate,R,Dplyr,Lubridate,我有一个数据集,df Read Box ID Time Subject T out 10/1/2019 9:00:01 AM T out 10/1/2019 9:00:02 AM Re: T out 10/1/2019 9:00:03 AM

我有一个数据集,df

 Read      Box       ID      Time                             Subject 
 T         out               10/1/2019 9:00:01 AM
 T         out               10/1/2019 9:00:02 AM             Re:
 T         out               10/1/2019 9:00:03 AM             Re:
 T         out               10/1/2019 9:02:59 AM             Re:
 T         out               10/1/2019 9:03:00 AM
 F                           10/1/2019 9:05:00 AM
 T         out               10/1/2019 9:06:00 AM             Fwd:
 T         out               10/1/2019 9:06:02 AM             Fwd:
 T         in                10/1/2019 9:07:00 AM
 T         in                10/1/2019 9:07:02 AM
 T         out               10/1/2019 9:07:04 AM
 T         out               10/1/2019 9:07:05 AM             Fw:
 T         out               10/1/2019 9:07:06 AM             Fw:
           hello             10/1/2019 9:07:08 AM
基于此数据集中的某些条件,我想创建一个startime列和一个endtime列

我希望在出现以下情况时创建一个“开始时间”:如果主题列的第一个单词以RE:、RE、FWD或FW连续开头,则Read==T、Box==out和ID==

当此条件的第一个实例发生时,将生成starttime。例如,对于该数据集,起始时间将为2019年1月10日9:00:02 AM,因为这是我们看到出现所需条件的地方。第一个主题为FW:、RE:或FWD、Read=T、Box=out和ID= 然而,当这些条件中的任何一个都不成立时,将创建一个结束时间。因此,第一个结束时间将出现在第4行之前,时间是2019年1月10日上午9:02:59。我的最终目标是为此创建一个持续时间列

包括RE、Fwd和Fw时,这是我想要的输出

  starttime                    endtime                     duration

  10/1/2019 9:00:02 AM        10/1/2019 9:02:59 AM         177 secs
  10/1/2019 9:06:00 AM        10/1/2019 9:06:02 AM         2 secs
  10/1/2019 9:07:05 AM        10/1/2019 9:07:06 AM         1 secs
  starttime                    endtime                     duration

  10/1/2019 9:00:01 AM        10/1/2019 9:00:01 AM         0 secs
  10/1/2019 9:03:00 AM        10/1/2019 9:03:00 AM         0 secs
  10/1/2019 9:07:04 AM        10/1/2019 9:07:04 AM         0 secs
此外,我如何在单独的代码中指定这些条件的开始时间和结束时间: Read=T,Box=out,ID=当主题列中的第一个单词不包含Re、Fwd或Fw时

 Read      Box       ID      Time                             Subject 
 T         out               10/1/2019 9:00:01 AM
 T         out               10/1/2019 9:00:02 AM             Re:
 T         out               10/1/2019 9:00:03 AM             Re:
 T         out               10/1/2019 9:02:59 AM             Re:
 T         out               10/1/2019 9:03:00 AM
 F                           10/1/2019 9:05:00 AM
 T         out               10/1/2019 9:06:00 AM             Fwd:
 T         out               10/1/2019 9:06:02 AM             Fwd:
 T         in                10/1/2019 9:07:00 AM
 T         in                10/1/2019 9:07:02 AM
 T         out               10/1/2019 9:07:04 AM
 T         out               10/1/2019 9:07:05 AM             Fw:
 T         out               10/1/2019 9:07:06 AM             Fw:
           hello             10/1/2019 9:07:08 AM
这是排除RE、Fwd和Fw时所需的输出

  starttime                    endtime                     duration

  10/1/2019 9:00:02 AM        10/1/2019 9:02:59 AM         177 secs
  10/1/2019 9:06:00 AM        10/1/2019 9:06:02 AM         2 secs
  10/1/2019 9:07:05 AM        10/1/2019 9:07:06 AM         1 secs
  starttime                    endtime                     duration

  10/1/2019 9:00:01 AM        10/1/2019 9:00:01 AM         0 secs
  10/1/2019 9:03:00 AM        10/1/2019 9:03:00 AM         0 secs
  10/1/2019 9:07:04 AM        10/1/2019 9:07:04 AM         0 secs
dput:

建议的代码有效,我只想同时包含主题栏条件: 其中Subject==FW,FWD,请重新忽略大小写 和 如果Subject不等于FW,FWD,请重新忽略大小写

library(dplyr)

df %>%
mutate(Time = lubridate::mdy_hms(Time), 
cond = Read == "T" & Box == "out" & ID == "" & Subject == "FW" & Subject  == "FWD" & Subject == "RE" (ignore.case = TRUE)
grp = cumsum(!cond)) %>%
filter(cond) %>%
group_by(grp) %>%
summarise(starttime = first(Time), 
endtime = last(Time), 
duration = difftime(endtime, starttime, units = "secs")) %>%
select(-grp)
图书馆弹琴

df %>%
mutate(Time = lubridate::mdy_hms(Time), 
cond = Read == "T" & Box == "out" & ID == "" & Subject! == "FW" & Subject! == "FWD" & Subject! == "RE" (ignore.case = TRUE)
grp = cumsum(!cond)) %>%
filter(cond) %>%
group_by(grp) %>%
summarise(starttime = first(Time), 
endtime = last(Time), 
duration = difftime(endtime, starttime, units = "secs")) %>%
select(-grp)

你的另一个问题已经回答了你问题的一部分。我知道这可能会很困难,但下一次请尽量减少你的问题,把重点放在你还不知道的事情上

如果要检测子字符串,最好的方法是从tidyverse的stringr包部分使用str_detect:


这使用正则表达式regex,这是一个很好的学习方法。这本书很容易阅读,因为它只有OR运算符,但可能性是无限的。

谢谢,我会试试这个!是否还有一种方法可以将thresh合并到该代码中?假设thresh%group\u bygrp=cumsumgap>gap\u threshold%>%summarisebegin=minTime,end=maxTime,duration=difftimeend,begin,units=secs@TanishaHudson这似乎是另一种算法,因此可能值得提出另一个问题。这个代码有什么问题?它至少在我的控制台中工作。尝试这样做@Dan Chaltiel:thresh%mutateTime=mdy\u hmsTime,cond=Read==T&Box==out&ID=&str\u detectObject,regex'FW | FWD | RE',忽略案例=TRUE,grp=cumsum!cond%>%filtercond%>%gap=c0,diffTime%>%group\u bygrp=cumsumgap>thresh%>%SummarieBegin=minTime,end=maxTime,duration=difftimeend,begin,units=secs%>%select-grp@TanishaHudsonbis:-这似乎是另一种算法,因此可能值得提出另一个问题。这个代码有什么问题?它至少在我的控制台中工作。您可以在注释中为代码使用`,因为您的代码没有问题。这是一个好词,我还试图在其中加入一个“thresh”。非常感谢。