R长格式data.table按分组与时间条件修改变量的实现方法
长格式data.table字符型变量按分组条件修改方案
你的需求本质是按id分组后,一旦x出现目标值'a',后续所有行的x都保持为'a',和你之前数值型场景用cummax的逻辑完全一致,只需要把数值判断转换为字符型的逻辑判断即可,以下是可直接运行的实现:
最简实现方案
dt2[, x := x[cummax(x == 'a') == 1], by = id]
逻辑说明
x == 'a'会按分组生成逻辑向量,匹配到'a'时为TRUE(对应数值1),否则为FALSE(对应数值0)- 对逻辑向量取
cummax(累积最大值)后,一旦出现1就会保持为1,刚好对应「只要出现过'a'后续行都用'a'」的规则 - 用生成的累积最大值为1的位置索引
x,即可实现目标赋值
运行后输出结果完全符合需求:
id time x 1: 1 1 a 2: 1 2 a 3: 1 3 a 4: 2 1 b 5: 2 2 a 6: 2 3 a
分步实现(更易调整规则)
如果需要拆分步骤方便调整判断条件,可以用以下写法:
# 1. 按分组标记是否已经出现过目标值'a' dt2[, has_a := cummax(x == 'a'), by = id] # 2. 所有标记为已出现的行赋值为'a' dt2[has_a == 1, x := 'a'] # 3. 删除辅助标记列 dt2[, has_a := NULL]
内容的提问来源于stack exchange,提问作者MDSF
相关产品推荐
相关产品推荐

