【问题标题】:R datatable grouping based on condition and getting count based on the conditions基于条件的R数据表分组并根据条件获取计数
【发布时间】:2020-05-29 14:47:56
【问题描述】:

我有一个这样的数据表:

timestamp           type    status
05-01-2020 12:07:08    A      1
05-01-2020 12:36:05    A      1 
05-01-2020 13:34:25    A      1 
05-01-2020 23:45:02    A      1
05-01-2020 23:55:02    B      1
05-01-2020 13:44:33    B      2
06-01-2020 01:07:08    A      1 
06-01-2020 10:23:05    A      1
06-01-2020 12:11:08    A      2
06-01-2020 22:06:12    B      2
07-01-2020 00:01:05    A      2
07-01-2020 02:17:09    A      1
07-01-2020 12:36:05    B      1
07-01-2020 12:07:08    B      1
07-01-2020 12:36:05    A      1
07-01-2020 12:36:05    A      1
08-01-2020 12:36:05    B      2
08-01-2020 12:36:05    B      1
08-01-2020 12:36:05    B      1
09-01-2020 12:36:05    B      1 
09-01-2020 12:07:08    B      2
09-01-2020 12:36:05    B      1
11-01-2020 12:07:08    A      1
11-01-2020 12:36:05    A      1

我正在尝试将其按日期分组并使用rleid() 键入。

dt <- dt[, group_id := rleid(as.IDate(timestamp),type,status = 1)][]

现在我想算两个数。

一种是统计每组内每天满足条件的实例数。

date         type  count
05-01-2020    A      4
05-01-2020    B      1
06-01-2020    A      2
07-01-2020    A      3
07-01-2020    B      2
08-01-2020    B      2
09-01-2020    B      2
11-01-2020    A      2

第二个是找到每天满足条件的组数。

date         type  count
05-01-2020    A      1
05-01-2020    B      1
06-01-2020    A      1
07-01-2020    A      2
07-01-2020    B      1
08-01-2020    B      1
09-01-2020    B      2
11-01-2020    A      1

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以先用as.POSIXct将'timestamp'转换成Datetime类,然后再转换成Date

    library(data.table)
    setDT(dt)[, timestamp := as.POSIXct(timestamp, 
         format = '%m-%d-%Y %H:%M:%S')][, date := as.IDate(timestamp)]
    dt[status == 1, .N, .(date, type)]
    #.        date type N
    #1: 2020-05-01    A 4
    #2: 2020-05-01    B 1
    #3: 2020-06-01    A 2
    #4: 2020-07-01    A 3
    #5: 2020-07-01    B 2
    #6: 2020-08-01    B 2
    #7: 2020-09-01    B 2
    #8: 2020-11-01    A 2
    

    对于第二种情况

    dt[, grp := rleid(type, status, date)]
    dt[status == 1, .(count = uniqueN(grp)), .(date, type)]
    #         date type count
    #1: 2020-05-01    A     1
    #2: 2020-05-01    B     1
    #3: 2020-06-01    A     1
    #4: 2020-07-01    A     2
    #5: 2020-07-01    B     1
    #6: 2020-08-01    B     1
    #7: 2020-09-01    B     2
    #8: 2020-11-01    A     1
    

    数据

    dt <- structure(list(timestamp = structure(c(1588349228, 1588350965, 
    1588354465, 1588391102, 1588391702, 1588355073, 1590988028, 1591021385, 
    1591027868, 1591063572, 1593576065, 1593584229, 1593621365, 1593619628, 
    1593621365, 1593621365, 1596299765, 1596299765, 1596299765, 1598978165, 
    1598976428, 1598978165, 1604250428, 1604252165), class = c("POSIXct", 
    "POSIXt"), tzone = ""), type = c("A", "A", "A", "A", "B", "B", 
    "A", "A", "A", "B", "A", "A", "B", "B", "A", "A", "B", "B", "B", 
    "B", "B", "B", "A", "A"), status = c(1L, 1L, 1L, 1L, 1L, 2L, 
    1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 
    1L, 1L)), class = "data.frame", row.names = c(NA, -24L), 
    index = structure(integer(0), "`__status`" = c(1L, 
    2L, 3L, 4L, 5L, 7L, 8L, 12L, 13L, 14L, 15L, 16L, 18L, 19L, 20L, 
    22L, 23L, 24L, 6L, 9L, 10L, 11L, 17L, 21L)))
    

    【讨论】:

    • 如果我需要在这一行中添加一个条件以及status == 1 怎么办:dt[status == 1, .(count = uniqueN(grp)), .(date, type)]
    • @VJD 你可以有dt[status == 1 &amp; newcondition, .(count = ..
    • The items in the 'by' or 'keyby' list are length (0,0,1). Each must be length 0; the same length as there are rows in x (after subsetting if i is provided).
    • @VJD 能否展示一下您的情况或更新您的帖子,以便更容易理解您的意思
    • @VJD 你要加什么条件
    【解决方案2】:

    1) 统计每个组内每天满足条件的实例数。

    library(data.table)
    setDT(df)
    df[, .(count = sum(status == 1)), .(timestamp, type)]
    
    #    timestamp type count
    #1: 05-01-2020    A     4
    #2: 05-01-2020    B     1
    #3: 06-01-2020    A     2
    #4: 06-01-2020    B     0
    #5: 07-01-2020    A     3
    #6: 07-01-2020    B     2
    #7: 08-01-2020    B     2
    #8: 09-01-2020    B     2
    #9: 11-01-2020    A     2
    

    如果不需要,您可以删除 0 计数。


    2) 查找每天满足条件的组数。

    使用rleidtypestatus 创建一个新列(count_N),并为status = 1 计算每个timestamptype 的唯一值。

    df[, count_N := rleid(type, status), timestamp]
    df[status == 1, .(count = uniqueN(count_N)), .(timestamp, type)]
    
    
    #    timestamp type count
    #1: 05-01-2020    A     1
    #2: 05-01-2020    B     1
    #3: 06-01-2020    A     1
    #4: 07-01-2020    A     2
    #5: 07-01-2020    B     1
    #6: 08-01-2020    B     1
    #7: 09-01-2020    B     2
    #8: 11-01-2020    A     1
    

    【讨论】:

    • 如果我需要在这一行中添加一个条件以及status == 1 怎么办:df[status == 1, .(count = uniqueN(count_N)), .(timestamp, type)]
    • @VJD 是的,您可以根据需要添加更多条件。你能澄清一下你想添加哪些条件吗?
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2014-11-20
    • 2015-07-19
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多