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

R长格式data.table按ID跨多行多列条件生成group变量问题

你的代码问题在于条件是逐行判断的,所以ID=1的time=1行单独判断时time==1 & x=="Y"不成立,time==3 & z=="YY"也不成立,自然返回N,不符合需求里「只要ID满足条件,该ID下所有time=1和time=3行都赋值Y」的逻辑。

正确实现代码

library(data.table)
dt <- data.table(ID=c(rep(1,3),rep(2,2)), time=c(1:3,1,2), x=c("N","N","Y","Y","N"), z=c(NA,NA,"YY",NA,NA))

dt[, group := {
  # 先判断当前ID是否同时有time=1和time=3的记录
  has_t1_t3 <- all(c(1,3) %in% time)
  if(!has_t1_t3) {
    rep(NA_character_, .N)
  } else {
    # 判断是否满足两个条件任意一个
    cond <- (x[time==1] == "Y") | (z[time==3] == "YY")
    if(cond) {
      # 满足条件的ID:time=1/3赋值Y,其余为NA
      ifelse(time %in% c(1,3), "Y", NA_character_)
    } else {
      rep(NA_character_, .N)
    }
  }
}, by = ID]

运行结果

ID time x    z group
1:  1    1 N <NA>     Y
2:  1    2 N <NA>  <NA>
3:  1    3 Y   YY     Y
4:  2    1 Y <NA>  <NA>
5:  2    2 N <NA>  <NA>

如果需要更简洁的链式写法,也可以用如下代码:

dt[, valid_id := all(c(1,3) %in% time) & ((x[time==1] == "Y") | (z[time==3] == "YY")), by = ID][
  valid_id == TRUE & time %in% c(1,3), group := "Y"][, valid_id := NULL]

内容的提问来源于stack exchange,提问作者MDSF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:03