【发布时间】:2020-03-22 17:21:48
【问题描述】:
序言: 主要问题是如何根据 ID 对数据表进行子集化,根据连续时间差在 ID 内形成子集。非常欢迎对此提供提示。
完整的问题/设置:
我有一个 data.table 格式的数据集 dt,看起来像
date id val1 val2
%d.%m.%Y
1 01.01.2000 1 5 10
2 09.01.2000 1 4 9
3 01.08.2000 1 3 8
4 01.01.2000 2 2 7
5 01.01.2000 3 1 6
6 14.01.2000 3 7 5
7 28.01.2000 3 8 4
8 01.06.2000 3 9 3
我想合并间隔不超过两周的观察结果(按id 分组)(从观察到观察)。通过组合我的意思是对于每个子集,我
- 保留
val1最后一次观察的值 - 将最后一次观察的
val2替换为该组val2的所有值的总和 - 添加
counter了解该组中有多少观察结果。
也就是说,我想最终得到这样的数据集
date id val1 val2 counter
%d.%m.%Y
2 09.01.2000 1 4 19 2
3 01.08.2000 1 3 8 1
4 01.01.2000 2 2 7 1
7 28.01.2000 3 8 15 3
8 01.06.2000 3 9 3 1
不过,我仍试图围绕 data.table 函数,尤其是 .SD 函数,并希望使用这些工具解决问题。
目前为止我知道
- 我可以使用
setkey(dt,date)来说明我所说的第一个和最后一个的意思 - 我可以用总和替换子集的最后一个
val2dt[, val2 := replace(val2, .N, sum(val2[-.N], na.rm = TRUE)), by=id] - 我用
[.N]得到子集的长度 - 如何删除行
- 我可以用
difftime(strptime(dt$date[1],format ="%d.%m.%Y"),strptime(dt$date[2],format ="%d.%m.%Y"),units="weeks")计算两个日期之间的差异
但是我不知道如何对观察进行子集化,以使每个子集仅包含相同id 的观察组,并且(连续)距离的日期最长为 2 周。
感谢任何帮助。非常感谢。
【问题讨论】:
标签: r data-cleaning