基于data.table:纵向数据集取指定条件首个实例,无则取最后非条件实例
data.table分组筛选逻辑实现
首先构造示例数据集:
ll <- data.table(ID=rep(1:3,each=3), num=c(1:9), var=c("a","b","c","a","b","b","a","c","c")) setorder(ll,ID,num,var)
需求明确:按ID分组后,组内存在var="c"的记录时,取该组第一个var="c"的实例;组内无var="c"的记录时,取该组最后一条非"c"的实例。
简洁实现代码
通过分组内的条件判断直接定位目标行,一行代码即可完成需求:
ll[, .SD[if(any(var == "c")) which(var == "c")[1] else .N], by = ID]
逻辑解释
any(var == "c"):判断当前分组是否存在var="c"的记录- 若存在:用
which(var == "c")[1]获取第一个var="c"的行索引,再通过.SD提取该行 - 若不存在:直接取分组的最后一行(
.N代表当前分组的总行数,对应最后一条记录的索引)
运行结果
ID num var <int> <int> <char> 1: 1 3 c 2: 2 6 b 3: 3 8 c
内容的提问来源于stack exchange,提问作者Misha
相关产品推荐
相关产品推荐

