为了账号安全,请及时绑定邮箱和手机立即绑定

根据特定条件对数据进行分组,并在 R 或 Python 中查找持续时间

根据特定条件对数据进行分组,并在 R 或 Python 中查找持续时间

陪伴而非守候 2022-08-11 20:18:12
我有一个数据集df,如下所示: subject    recipient                  length   folder    message  date                       edit                                        80      out                1/2/2020 1:00:01 AM        T                                                                            80      out                1/2/2020 1:00:05 AM        T                   hey        sarah@mail.com,g@mail.com    80      out                1/2/2020 1:00:10 AM        They        sarah@mail.com,g@mail.com    80      out                1/2/2020 1:00:15 AM        They        sarah@mail.com,g@mail.com    80      out                1/2/2020 1:00:30 AM        Tsome       k                           900      in       jjjjj     1/2/2020 1:00:35 AM        Fsome       k                           900      in       jjjjj     1/2/2020 1:00:36 AM        F some       k                           900      in       jjjjj     1/2/2020 1:00:37 AM        Fhey        sarah@mail.com,g@mail.com    80    draft                1/2/2020 1:02:00 AM        They        sarah@mail.com,g@mail.com    80    draft                1/2/2020 1:02:05 AM        T    no         a                          900       in        iii      1/2/2020 1:02:10 AM        Fno         a                          900       in        iii      1/2/2020 1:02:15 AM        Fno         a                          900       in        iii      1/2/2020 1:02:20 AM        Fno         a                          900       in        iii      1/2/2020 1:02:25 AM        F数据集表示用户何时编辑消息、离开并继续执行该消息。我正在尝试捕获手头消息的总持续时间。我知道我必须首先对消息进行分组。我希望根据以下条件对消息进行分组:如果“文件夹”列为 == “out” 或 “draft”,如果“消息”列为 == “”,并且 Edit == “T”,则“长度”列也应连续相同。因此,一旦我有了这些组,我希望找到这些组的持续时间(开始和结束)。例如,第一组持续时间为 29 秒,因为它从 1/2/2020 1:00:01 AM 开始,到 1/2/2020 1:00:30 AM 结束。第二组将于1/2/2020 1:02:00开始,并于凌晨1:02:05结束。最后,第三组从1/2/2020 1:03:00 AM开始,到1:03:20 AM结束。此外,由于这些组都属于同一邮件,因此我想使用以下逻辑将这些组完全链接在一起:组最后一行中的“主题”、“收件人”和“长度”内容与下一个组的第一行“主题”、“收件人”和“长度”匹配,则这些都属于同一组。
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

df %>% 

  # The original data was loaded as factors, which have their uses, but

  #   converting those to characters will be simpler to work with here.

  mutate_if(is.factor, as.character) %>% 

  # I'm replacing NA in Subj & Recip with an empty string, and trimming 

  #    excess spaces from the start and end. One of the recipients is " "

  #    but I assume that's functionally the same as blank.

  mutate_at(c("Subject", "Recipient"), ~if_else(is.na(.), "", stringr::str_trim(.))) %>%

  filter(Subject != '') %>%

  mutate(Date = as.POSIXct(Date, format = '%m/%d/%Y %H:%M:%OS')) %>%

  mutate(cond = Edit & Folder %in% c('out', 'draft') & Message == '') %>% 

  mutate(segment = cumsum(!cond)) %>%

  filter(cond) %>%   # EDIT: Added to exclude rows matching cond


  # Get summary stats for each segment

  group_by(Subject, Recipient, Length, segment) %>%

  summarize(Start = min(Date),

            End = max(Date),

            Duration = End - Start) %>%


  # This counts the number of times that these columns don't match their

  #   predecessor. TRUE = 1, so we get 1 when anything changes.

  #   Look at ?lag for more on what those parameters mean.

  mutate(new_group = (Subject   != lag(Subject, 1, "")) *

                     (Recipient != lag(Recipient, 1, "")) *

                     (Length    != lag(Length, 1, ""))) %>%

  ungroup() %>%

  mutate(group = LETTERS[cumsum(new_group)])




# A tibble: 3 x 9

  Subject Recipient                   Length segment Start               End                 Duration new_group group

  <chr>   <chr>                        <int>   <int> <dttm>              <dttm>              <drtn>       <int> <chr>

1 hey     sarah@mail.com,gee@mail.com     80       0 2020-01-02 01:00:10 2020-01-02 01:00:30 20 secs          1 A    

2 hey     sarah@mail.com,gee@mail.com     80       3 2020-01-02 01:02:00 2020-01-02 01:02:05  5 secs          0 A    

3 hey     sarah@mail.com,gee@mail.com     80       7 2020-01-02 01:03:00 2020-01-02 01:03:20 20 secs          0 A    


查看完整回答
反对 回复 2022-08-11
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号