我有以下data.table:
require(data.table)
dt = data.table(
id = c(rep('Grp 1', 31), rep('Grp 2', 31)),
date = rep(as.IDate(as.IDate('2020-01-01') : as.IDate('2020-01-31')), 2),
change = c(rep(NA, 5), rep('yes', 5), rep(NA, 10), rep('yes', 3), rep(NA, 8),
rep(NA, 2), rep('yes', 8), rep(NA, 8), rep('yes', 5), rep(NA, 8))
)
对于每一个组id
我要过滤的第一和最后date
一个系列,它是由第二个塔限定小号change
是yes
(即非NA)。我可以执行以下操作,这将按组为我提供第一个和最后一个非NA行。但是,问题在于每个组不止一次发生该系列。
dt[ !is.na(change),
.(head(date, 1),
tail(date, 1)),
.(id) ]
这些是我想要过滤的行索引:
dt[c(6,10,21,23,34,41,50,54)]
一种方法是为由id
和change
组合标识的每个条纹赋予唯一的组ID 。我们可以rleid
用来生成这种游程类型的id。考虑这样的事情
dt[,
gid := rleid(id, change)
][!is.na(change),
as.list(range(date)),
by = .(id, gid)
][,
gid := NULL
]
请注意,我还假设您需要日期范围,而不是真正的第一个和最后一个元素。如果日期不是按时间顺序排列,则您的方法将失败。输出看起来像这样
id V1 V2
1: Grp 1 2020-01-06 2020-01-10
2: Grp 1 2020-01-21 2020-01-23
3: Grp 2 2020-01-03 2020-01-10
4: Grp 2 2020-01-19 2020-01-23
rleid
像这样
> rleid(c(1, 1, 2, 3, 3), c("a", "b", "b", "d", "d"))
[1] 1 2 3 4 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句