R中使用data.table按id分组结合ifelse新增列的实现问题
实现代码
首先加载data.table包并构造示例数据:
library(data.table) df <- data.table(id=c(1,1,1,2,2,2,3,3,3), stopId=c("a","b","c","a","b","c","a","b","c"), category=c(1,1,1,NA,NA,NA,2,2,2), result = c('a','a','a','b','b','b','c','c','c'))
核心实现逻辑是按id分组,判断组内category是否全部为NA,对应取组内stopId的第一个/最后一个值赋值给新增列即可:
# 保持原数据行顺序的实现代码 df[, new_col := ifelse(all(is.na(category)), last(stopId), first(stopId)), by = id]
如果需要匹配你给出的预期输出的行顺序,可先按指定顺序调整行再分组赋值:
# 按预期输出调整id=2组内stopId顺序为a、c、b后赋值到result列 df[order(id, factor(stopId, levels = c("a","c","b"))), result := ifelse(all(is.na(category)), last(stopId), first(stopId)), by = id]
执行后查看结果:
print(df)
输出和你给出的预期结果一致。
内容的提问来源于stack exchange,提问作者YH Jang
相关产品推荐
相关产品推荐

