r - 计算 data.table 中事件以来的天数
问题描述
library(data.table)
dt <- data.table(cbind(id = c(rep("0151", 16), rep("4615", 16)),
date = rep(c("2011-08-09",
"2011-08-10",
"2011-08-12",
"2011-08-14",
"2011-08-15",
"2011-08-16",
"2011-08-17",
"2011-08-18",
"2011-08-19",
"2011-08-20",
"2011-08-23",
"2011-08-24",
"2011-08-27",
"2011-08-28",
"2011-08-30",
"2011-08-31"), 2),
count = c(c(7, 1, 0, 4, 1, 4, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1),
c(0, 1, 3, 0, 1, 0, 5, 1, 0, 0, 5, 0, 1, 2, 0, 1))))
对于每个 id,我正在寻找一种方法来有效地计算(并存储在新列中)自最后一天计数 > 0 以来已经过去了多少天。所以第 4 列看起来像这样:
c(NA, 1, 2, 4, 1, 1, 1, 1, 1, 2, 5, 6, 9, 10, 2, 3, NA, NA, 2, 2, 3, 1, 2, 1, 1, 2, 5, 1, 4, 1, 2, 3)
解决方案
我们可以使用na.locf
fromzoo
创建一个新的日期列,其中从最后一天开始的日期count > 0
向下填充并取lag
of ,因为如果给定日期本身有,我们不想返回 0 天count > 0
。相反,我们想计算从前一个非零count
日期开始的天数。最后我们找到difftime
了date
和date2
:
library(data.table)
library(zoo)
dt[,count2 := difftime(date, na.locf(lag(ifelse(count > 0, date, NA)), na.rm = FALSE)), by = id]
结果:
id date count count2
1: 0151 2011-08-09 7 NA days
2: 0151 2011-08-10 1 1 days
3: 0151 2011-08-12 0 2 days
4: 0151 2011-08-14 4 4 days
5: 0151 2011-08-15 1 1 days
6: 0151 2011-08-16 4 1 days
7: 0151 2011-08-17 2 1 days
8: 0151 2011-08-18 1 1 days
9: 0151 2011-08-19 0 1 days
10: 0151 2011-08-20 0 2 days
11: 0151 2011-08-23 0 5 days
12: 0151 2011-08-24 0 6 days
13: 0151 2011-08-27 0 9 days
14: 0151 2011-08-28 1 10 days
15: 0151 2011-08-30 0 2 days
16: 0151 2011-08-31 1 3 days
17: 4615 2011-08-09 0 NA days
18: 4615 2011-08-10 1 NA days
19: 4615 2011-08-12 3 2 days
20: 4615 2011-08-14 0 2 days
21: 4615 2011-08-15 1 3 days
22: 4615 2011-08-16 0 1 days
23: 4615 2011-08-17 5 2 days
24: 4615 2011-08-18 1 1 days
25: 4615 2011-08-19 0 1 days
26: 4615 2011-08-20 0 2 days
27: 4615 2011-08-23 5 5 days
28: 4615 2011-08-24 0 1 days
29: 4615 2011-08-27 1 4 days
30: 4615 2011-08-28 2 1 days
31: 4615 2011-08-30 0 2 days
32: 4615 2011-08-31 1 3 days
id date count count2
推荐阅读
- android - Android 报告错误的 IP 地址
- nestjs - nestjs 如何使用@nestjs/swagger 生成有关 Passport 策略路由的文档
- python - 如何在熊猫中列出具有相应索引的列?
- gitlab - Gitlab,如何在代码审查中更改制表大小
- c# - 对具有局部变量的静态方法的并发请求
- git - 再学习:将 Git 与远程存储库一起使用
- jquery - 用 .data() 替换 href 中的特定单词
- python - 如何从python向openfire xmpp服务器发送数据并在xmpp客户端(如spark)中接收?
- mysql - 如何正确地将数据从动态 DataTable 插入 MySQL?
- sapui5 - sap.m.Input 的 ValueStateText