【问题标题】:Group_by, and create new column with durationGroup_by,并创建具有持续时间的新列
【发布时间】:2020-01-31 02:29:49
【问题描述】:

我有数据集,df,

  Subject      Folder      Message    Date
  A            Out                   9/9/2019 5:46:38 PM
  A            Out                   9/9/2019 5:46:40 PM
  A            Out                   9/9/2019 5:46:42 PM
  B            Out                   9/9/2019 5:48:00 PM
  B            Out                   9/9/2019 5:48:01 PM
  C            Out                   9/10/2019 5:49:01 PM

如何按主题对其进行分组,然后找到持续时间,同时创建一个新的持续时间列。 这是我想要的输出:

  Subject   Duration    Group
  A         4 sec      outdata1
  B         1 sec      outdata2
  C         0 sec      outdata3

这是我的输入:

         structure(list(Subject = structure(c(1L, 1L, 1L, 2L, 2L, 3L), .Label =                 c("A", 
         "B", "C"), class = "factor"), Folder = structure(c(1L, 1L, 1L, 
         1L, 1L, 1L), .Label = "Out", class = "factor"), Message = c("", 
         "", "", "", "", ""), Date = structure(c(2L, 3L, 4L, 5L, 6L, 1L
         ), .Label = c("9/10/2019 5:49:01 PM", "9/9/2019 5:46:38 PM", 
         "9/9/2019 5:46:40 PM", "9/9/2019 5:46:42 PM", "9/9/2019 5:48:00 PM", 
         "9/9/2019 5:48:01 PM"), class = "factor")), row.names = c(NA, 
         -6L), class = "data.frame")

这是我尝试过的:

df %>%  
mutate(Date = mdy_hms(Date)) %>% 
transmute(Subject, Duration = diff = difftime(as.POSIXct(Date, format = 
"%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Date, 
format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs")) %>% 
ungroup %>% 
distinct %>% 
mutate(grp = str_c("Outdata", row_number()))

感谢任何帮助

【问题讨论】:

  • 这不是4、1、0df %>% mutate(Date = mdy_hms(Date)) %>% group_by(Subject) %>% summarise(Duration = diff(range(Date)))
  • 是的。让我纠正一下。让我试试

标签: r dplyr


【解决方案1】:

在这里,我们可以在summarise 步骤之前使用“主题”分组

library(dplyr)
library(lubridate)
library(stringr)
df %>%
   mutate(Date = mdy_hms(Date)) %>% 
   group_by(Subject) %>%
   summarise(Duration = diff(range(Date))) %>% 
   mutate(grp = str_c("Outdata", row_number()))
# A tibble: 3 x 3
#  Subject Duration grp     
#  <fct>   <drtn>   <chr>   
#1 A       4 secs   Outdata1
#2 B       1 secs   Outdata2
#3 C       0 secs   Outdata3

如果我们需要控制unit,请使用difftime

df %>%
    mutate(Date = mdy_hms(Date)) %>%
    group_by(Subject) %>%
    summarise(Duration = difftime(max(Date), min(Date), unit = 'sec')) %>%
    mutate(grp = str_c("Outdata", row_number()))

【讨论】:

  • 这行得通。谢谢你。我将其用作解决我之前的困境(与我的数据集有关)的解决方法,谢谢!我会在 2 分钟内接受
  • 如何将输出设置为仅几秒钟? unit = "secs" 会去哪里?我不确定?日期之后?
  • 嗨@Akrun,有没有办法在这段代码中加入“thresh”?我的数据中有一些日期时间是 9/10/2019 12:34:22 AM 9/10/2019 10:49:14 PM,因此它反映了不准确的持续时间。我可以在代码中添加这个吗?阈值 % 变异(日期 = mdy_hms(日期))%>% group_by(主题)%>% 变异(diff1 = 日期 - 滞后(日期))%>%变异(持续时间 = if_else(diff1
  • @TanishaHudson 我猜你从其他发帖者的评论中得到了答案
【解决方案2】:

我们可以在基础 R 中做到这一点:

df$Date <- as.POSIXct(df$Date, format = "%m/%d/%Y %I:%M:%S %p")

transform(aggregate(Date~Subject, df, function(x) 
           difftime(max(x), min(x), units = "secs")), 
          Group = paste0('outdata', seq_along(Subject)))

#  Subject Date    Group
#1       A   4  outdata1
#2       B   1  outdata2
#3       C   0  outdata3

【讨论】:

  • 好的,谢谢@Ronak,有没有办法可以添加阈值,比如日期时间是否以这种方式运行:9/10/2019 12:34:22 AM 9/10/2019 10:49:14 PM ,因为我的数据集在发生这种情况时给出的持续时间不准确。如果时间超过10分钟,是否可以添加脱粒? thresh3 % 变异(日期 = mdy_hms(日期)) %>% group_by(主题) %>% 变异(diff1 = 日期 - 滞后(日期)) %>%我不确定如何将其合并到上面的代码中
  • 我想知道如果两个连续的日期时间超过 10 分钟,是否有办法在持续时间中添加某种类型的“中断”,然后创建一个新的持续时间。我还在研究这个。
  • 根据你想做什么你可以使用difftime(Date, lag(date), units = "mins") &gt; 10
  • ok @Ronak 像这样:transform(aggregate(Date~Subject, df, function(x) difftime(Date, lag(date), units = "mins") > 10, Group = paste0( 'outdata', seq_along(Subject))) 我还在学习,我正在看如何合并到上面的代码中
猜你喜欢
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2012-12-07
  • 2018-04-23
  • 2022-09-28
  • 1970-01-01
相关资源
最近更新 更多