基于R(dplyr)中的两个条件进行分组和重命名

基于R(dplyr)中的两个条件进行分组和重命名,r,dplyr,stringr,difftime,R,Dplyr,Stringr,Difftime,我有一个数据集,df: 最后,我希望能够将数据分组成“块”,其中文件夹列包含字符串“OUT”,确保考虑日期和与其关联的空消息值。是否有一种方法可以为每个“Out”实例创建一个块,并在计算其持续时间时生成一个空消息行 Folder DATE Message Outdata 9/9/2019 5:46:00 Outdata

我有一个数据集,df:

最后,我希望能够将数据分组成“块”,其中文件夹列包含字符串“OUT”,确保考虑日期和与其关联的空消息值。是否有一种方法可以为每个“Out”实例创建一个块,并在计算其持续时间时生成一个空消息行

  Folder               DATE                         Message
  Outdata              9/9/2019 5:46:00                   
  Outdata              9/9/2019 5:46:01
  Outdata              9/9/2019 5:46:02
  In                   9/9/2019 5:46:03            hello
  In                   9/9/2019 5:46:04            hello
  Outdata              9/10/2019 6:00:01
  Outdata              9/10/2019 6:00:02
  In                   9/11/2019 7:50:00           hello
  In                   9/11/2019 7:50:01           hello
我希望此输出:

 New Variable        Duration        Message
 Outdata1              2 sec
 Outdata2              1 sec
我已经包括了dput:

dput(sample)
structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 1L), .Label = c("In", "Outdata"), class = "factor"), Date = structure(c(5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L), .Label = c("9/10/2019 6:00:01 AM", 
"9/10/2019 6:00:02 AM", "9/11/2019 7:50:00 AM", "9/11/2019 7:50:01 AM", 
"9/9/2019 5:46:00 AM", "9/9/2019 5:46:01 AM", "9/9/2019 5:46:02 AM", 
"9/9/2019 5:46:03 AM", "9/9/2019 5:46:04 AM"), class = "factor"), 
Message = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("", 
"hello"), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))
这是我尝试过的,效果很好,我只需要考虑到 空消息值也是如此

  library(dplyr)

  df  %>%
  mutate(DATE = as.POSIXct(DATE, format = "%m/%d/%Y %I:%M:%S %p"), 
     gr = cumsum(Folder != lag(Folder, default = TRUE))) %>%
 filter(Folder == "Out") %>%
 arrange(gr, DATE) %>%
 group_by(gr) %>%
 summarise(Duration = difftime(last(DATE), first(DATE), units = "secs")) %>%
 mutate(gr = paste0('Out', row_number()))

上面的代码工作正常,但我不确定如何满足row==“p>的条件,可能只是将
消息粘贴到一个字符串中

library(dplyr)

sample  %>%
  mutate(DATE = as.POSIXct(Date, format = "%m/%d/%Y %I:%M:%S %p"), 
         gr = cumsum(Folder != lag(Folder, default = TRUE))) %>%
  filter(Folder == "Outdata") %>%
  arrange(gr, DATE) %>%
  group_by(gr) %>%
  summarise(Duration = difftime(last(DATE), first(DATE), units = "secs"), 
            Message = paste0(Message, collapse = "")) %>%
  mutate(gr = paste0('Out', row_number()))

也许可以将
过滤器(文件夹==“Out”)%%>%%
更改为
过滤器(文件夹==“Out”,消息==”“)%%>%%
?好的,我知道了!我想我会在上面的代码之前执行这个吗?非常感谢。我明白了,让我试试这个。“collapse”和“paste0”到底做了什么?@TanishaHudson它将组中的所有
消息
值捕获为一个字符串。好了,这很有效,哇,谢谢!(我必须等几分钟才能接受!)谢谢!你好@Ronak,还有一个条件。我必须按主题栏分组,这就是我最终找到时间的方式。我也可以加上:group_by(主题)吗?我想我会提出一个新问题。非常感谢。