r - data.table 中的连续天数按主题重置
问题描述
我正在尝试让新主题重置 Consecutive_days 列。我相信这很简单。我是 data.table 的新手。这可能在 data.table 中还是我需要转换回 data.frame ?
旧数据表:
DT = data.table(
Subject = rep(c("A", "B"), 4:3),
Date = as.Date(
sprintf("10-%02d-%02d", c(22:25, 25:27), rep(1:2, 4:3)),
'%m-%d-%y'
)
)
DT[]
# Subject Date
# 1: A 2001-10-22
# 2: A 2001-10-23
# 3: A 2001-10-24
# 4: A 2001-10-25
# 5: B 2002-10-25
# 6: B 2002-10-26
# 7: B 2002-10-27
我尝试了什么:
DT[, Consecutive_days := c(0,diff(Date)), by =.(Subject)]
发生了什么:
# Subject Date Consecutive_days
# 1: A 2001-10-22 0
# 2: A 2001-10-23 1
# 3: A 2001-10-24 1
# 4: A 2001-10-25 1
# 5: B 2002-10-25 0
# 6: B 2002-10-26 1
# 7: B 2002-10-27 1
我正在努力做到这一点;每次Subject
更改时重置
# Subject Date Consecutive_days
# 1: A 2001-10-22 0
# 2: A 2001-10-23 1
# 3: A 2001-10-24 2
# 4: A 2001-10-25 3
# 5: B 2002-10-25 0
# 6: B 2002-10-26 1
# 7: B 2002-10-27 2
解决方案
为什么不简单地添加一个分组语句by = Subject
来计算它 group_wise 和cumsum
你已经计算的差异字段。
library(data.table)
DT = data.table(
Subject = rep(c("A", "B"), 4:3),
Date = as.Date(
sprintf("10-%02d-%02d", c(22:25, 25:27), rep(1:2, 4:3)),
'%m-%d-%y'
)
)
DT[, cons_days := cumsum(c(0, diff(Date))), by = Subject]
DT
#> Subject Date cons_days
#> 1: A 2001-10-22 0
#> 2: A 2001-10-23 1
#> 3: A 2001-10-24 2
#> 4: A 2001-10-25 3
#> 5: B 2002-10-25 0
#> 6: B 2002-10-26 1
#> 7: B 2002-10-27 2
由reprex 包于 2021-05-18 创建 (v2.0.0 )
推荐阅读
- javascript - 如何在div中的选定文本下添加div?
- python - Python读取具有不同行数的csv文件
- xml - 使用 Golang 解组后如何检查 XML 中的所有元素和属性?
- python - 如何检查表对象中字段的值是否等于 django 模板语言中的特定字符串?
- c# - WCF 接收和返回大部分数据集迁移到 gRPC
- html - 为什么我的 CSS 只能在 546px 之外工作(使 div 居中),即使媒体查询被编程为处理这个问题?
- shell - 多个管道使文本流中的输出为空白
- javascript - 使用 JavaScript 创建弹出窗口
- javascript - 如何将选项标签内的标签文本居中对齐?
- c# - 如何正确提取以相同数字开头和结尾的数字