【问题标题】:ID and count repeating groups of data ordered by time [duplicate]ID和计数按时间排序的重复数据组[重复]
【发布时间】:2016-11-14 18:30:52
【问题描述】:

我有一个正在 R 中处理的数据集。我想将某个类别的出现时间分组,指示每个组出现的顺序。

数据按“id”分组,按“时间”采样,并具有“类别”标签(低、高)。

#make example data
id <- c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b")
time <- seq.POSIXt(as.POSIXct("10/24/16 21:05", format="%m/%d/%y %H:%M", tz="America/Chicago"), by="5 min", length.out=10)
category <- c("low", "high", "high", "low", "low", "low", "high", "high", "low", "low")
dat<-data.frame(id, time, category)
> dat
   id                time category
1   a 2016-10-24 21:05:00      low
2   a 2016-10-24 21:10:00     high
3   a 2016-10-24 21:15:00     high
4   a 2016-10-24 21:20:00      low
5   a 2016-10-24 21:25:00      low
6   b 2016-10-24 21:30:00      low
7   b 2016-10-24 21:35:00     high
8   b 2016-10-24 21:40:00     high
9   b 2016-10-24 21:45:00      low
10  b 2016-10-24 21:50:00      low

我想创建一个变量“组”来标记每个类别所属的时间组,例如: 如果类别 == 在时间 X 和时间 X+1 的类别,则它们在同一组中 如果 category != category 在时间 X 和时间 X+1,则组结束

组按时间排序,因此给定“类别”组的第一次出现是 1,接下来是 2。

这与计算每个类别标签随时间出现的次数的序列不同。虽然我需要对“组”值进行排序,但我需要在顺序“类别”的每个“组”中重复该值。

#example data of what I want 
dat$group <- c(1, 1, 1, 2, 2, 1, 1, 1, 2, 2) #this is the variable I want 
dat$seq <- with(dat, ave(as.character(category), category, FUN = seq_along)) #count sequence variable, which is different than what I'm after because it does not repeat within sequential categories
> dat
   id                time category group seq
1   a 2016-10-24 21:05:00      low     1   1
2   a 2016-10-24 21:10:00     high     1   1
3   a 2016-10-24 21:15:00     high     1   2
4   a 2016-10-24 21:20:00      low     2   2
5   a 2016-10-24 21:25:00      low     2   3
6   b 2016-10-24 21:30:00      low     1   4
7   b 2016-10-24 21:35:00     high     1   3
8   b 2016-10-24 21:40:00     high     1   4
9   b 2016-10-24 21:45:00      low     2   5
10  b 2016-10-24 21:50:00      low     2   6

基本上,这个想法是“组”是一个事件,它可以在不同的时间长度内发生。但即使它的长度不同,它仍然是同一个事件。所以你有第一个事件,第二个事件等等。

我在网上搜索过,但没有看到与问题匹配的帖子。如果我忽略了之前的帖子,欢迎提供相关帖子的链接。

提前感谢您的帮助!

已编辑,2016 年 12 月 14 日为清晰起见并试图引起人们的兴趣。

【问题讨论】:

    标签: r dplyr plyr lapply


    【解决方案1】:

    使用基础 R:

    dat$episode <- with(dat, ave(as.character(category), category, FUN = seq_along))
    

    或者使用 data.table 开发版中的rowid

    library(data.table)
    setDT(dat)[, episode := rowid(category)]
    

    或使用 dplyr

    library(dplyr)
    dat %>% 
      group_by(category) %>% 
      mutate(episode = row_number())
    

    所有都将给出所需的最终结果(显示 dplyr 的输出):

                      time category episode
                    <dttm>   <fctr>   <int>
    1  2016-10-24 21:05:00      low       1
    2  2016-10-24 21:10:00     high       1
    3  2016-10-24 21:15:00     high       2
    4  2016-10-24 21:20:00      low       2
    5  2016-10-24 21:25:00      low       3
    6  2016-10-24 21:30:00   normal       1
    7  2016-10-24 21:35:00     high       3
    8  2016-10-24 21:40:00     high       4
    9  2016-10-24 21:45:00      low       4
    10 2016-10-24 21:50:00     high       5
    

    【讨论】:

    • 您也可以通过1:.N (根据我下面的回答)对data.table 的主分支执行此操作,所以我认为没有必要获得开发版本。
    • 感谢 dplyr 的出色回答和优雅使用!这很接近,但序列并不完全是我所追求的。我已经编辑了我的问题以在我尝试计算的变量旁边显示序列变量以突出显示差异。此外,为了清楚起见,编辑了问题。再次感谢您的帮助!
    【解决方案2】:

    我不能 100% 确定这是您所追求的,但假设我理解您的问题,您可以使用 data.table 包非常简单而优雅地完成此操作。

    library(data.table)
    setDT(dat)
    dat[, episode := 1:.N, by = category]
    
    #                    time category episode
    #  1: 2016-10-24 21:05:00      low       1
    #  2: 2016-10-24 21:10:00     high       1
    #  3: 2016-10-24 21:15:00     high       2
    #  4: 2016-10-24 21:20:00      low       2
    #  5: 2016-10-24 21:25:00      low       3
    #  6: 2016-10-24 21:30:00   normal       1
    #  7: 2016-10-24 21:35:00     high       3
    #  8: 2016-10-24 21:40:00     high       4
    #  9: 2016-10-24 21:45:00      low       4
    # 10: 2016-10-24 21:50:00     high       5
    

    解释:.N 是一个特殊变量,包含每组中的计数数(由by 设置)。 := 是用于赋值的特殊 data.table 语法。

    【讨论】:

    • 感谢您的精彩回答!这很接近,但序列并不完全是我所追求的。我已经编辑了我的问题以在我尝试计算的变量旁边显示序列变量以突出显示差异。此外,为了清楚起见,编辑了问题。再次感谢您的帮助!
    • 嗯,我明白了。您可以通过duplicated 函数巧妙地实现这一点。如果我想出一个完整的解决方案,我会发布它。
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2017-04-27
    • 2018-05-27
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多