You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:50:22