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
相关产品推荐
相关产品推荐

