【问题标题】:Counting cumulative unique occurence in a R data frame计算 R 数据框中的累积唯一出现次数
【发布时间】:2017-06-11 02:51:22
【问题描述】:

我正在处理一个数据集,它有两列:id、日期/时间。请在下面找到示例,

id  date_time
1   2016-10-29 18:01:03.0000000 +08:00
1   2016-10-29 19:34:17.0000000 +08:00
1   2016-10-30 14:08:03.0000000 +08:00
1   2016-10-30 15:55:12.0000000 +08:00
2   2016-10-31 11:32:12.0000000 +08:00
2   2016-10-31 14:59:56.0000000 +08:00
2   2016-11-01 12:49:44.0000000 +08:00
2   2016-11-01 13:55:16.0000000 +08:00
2   2016-11-01 19:18:22.0000000 +08:00
2   2016-11-01 20:40:48.0000000 +08:00
3   2016-11-01 21:19:50.0000000 +08:00
3   2016-11-02 14:20:15.0000000 +08:00
3   2016-11-02 18:52:27.0000000 +08:00
3   2016-11-02 19:39:32.0000000 +08:00
3   2016-11-03 08:55:41.0000000 +08:00

我想要获得的只是两列:第 1 列具有使用日期和时间排序的每个 id 的累积出现次数,第 2 列具有每个 id 的累积日期,如下表所示,

id  date_time                           occ date
1   2016-10-29 18:01:03.0000000 +08:00  1   1
1   2016-10-29 19:34:17.0000000 +08:00  2   1
1   2016-10-30 14:08:03.0000000 +08:00  3   2
1   2016-10-30 15:55:12.0000000 +08:00  4   2
2   2016-10-31 11:32:12.0000000 +08:00  1   1
2   2016-10-31 14:59:56.0000000 +08:00  2   1
2   2016-11-01 12:49:44.0000000 +08:00  3   2
2   2016-11-01 13:55:16.0000000 +08:00  4   2
2   2016-11-01 19:18:22.0000000 +08:00  5   2
2   2016-11-01 20:40:48.0000000 +08:00  6   2
3   2016-11-01 21:19:50.0000000 +08:00  1   1
3   2016-11-02 14:20:15.0000000 +08:00  2   2
3   2016-11-02 18:52:27.0000000 +08:00  3   2
3   2016-11-02 19:39:32.0000000 +08:00  4   2
3   2016-11-03 08:55:41.0000000 +08:00  5   3
  1. (请注意,+8:00 是多余的)。要生成第 1 列 (occ):我尝试使用 aveFUN=seq_along,首先拆分日期和时间,然后使用 id、日期和时间 order

    Q1:有什么方法可以直接对 date_time 列进行排序?

  2. 对于第 2 列(日期),我首先使用唯一值获取数据框的一个子集,我使用 aveseq_along 生成索引。之后,我将两个数据集合并为一个循环。

    Q2:有没有更有效的方法来达到同样的效果?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我不清楚您的date_time 变量的格式是什么。我假设它是POSIXct。我已经修剪掉了垃圾并将其转换为那个。

    d <- read.table(text="id,  date_time
    1,   2016-10-29 18:01:03.0000000 +08:00
    ...
    3,   2016-11-03 08:55:41.0000000 +08:00", header=TRUE, sep=",")
    d$date_time <- as.POSIXct(substr(as.character(d$date_time), 4, 22))
    

    此时您可以使用?order 对数据框进行排序,包括按日期排序(另请参阅:Understanding the order() function):

    d <- d[order(d$id, d$date_time),]
    

    对数据框进行排序后,要对每个id 中的行进行计数,您可以使用?tapply。您也可以通过组合as.characteras.Date,以及as.numericfactor 来使用tapply 来标记独特的日子。考虑:

    d$occ  <- unlist(with(d, tapply(id, id, FUN=function(x){ 1:length(x) })))
    d$date <- unlist(with(d, tapply(date_time, id, FUN=function(x){ 
                                      x = as.character(as.Date(x))
                                      as.numeric(factor(x, levels=unique(x))) 
                                    })))
    d
    #    id           date_time occ date
    # 1   1 2016-10-29 18:01:03   1    1
    # 2   1 2016-10-29 19:34:17   2    1
    # 3   1 2016-10-30 14:08:03   3    2
    # 4   1 2016-10-30 15:55:12   4    2
    # 5   2 2016-10-31 11:32:12   1    1
    # 6   2 2016-10-31 14:59:56   2    1
    # 7   2 2016-11-01 12:49:44   3    2
    # 8   2 2016-11-01 13:55:16   4    2
    # 9   2 2016-11-01 19:18:22   5    2
    # 10  2 2016-11-01 20:40:48   6    3
    # 11  3 2016-11-01 21:19:50   1    1
    # 12  3 2016-11-02 14:20:15   2    1
    # 13  3 2016-11-02 18:52:27   3    1
    # 14  3 2016-11-02 19:39:32   4    1
    # 15  3 2016-11-03 08:55:41   5    2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多