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

如何在data.table中替换列值为最后有效token,缺失时设为NA

解决data.table分组生成Var列的问题

可复现示例数据

输入数据:

library(data.table)
dt <- data.table(
  Team = c("A", "A", "A", "B", "B"),
  Year = c(2020, 2020, 2021, 2020, 2020),
  Str = c("X-Y-Z", "X-Y", "X-Y", "P-Q-R-S", "P-Q")
)

期望输出:

Team Year      Str   Var
1:    A 2020    X-Y-Z     Z
2:    A 2020      X-Y  <NA>
3:    A 2021      X-Y     Y
4:    B 2020 P-Q-R-S     S
5:    B 2020      P-Q  <NA>

问题根源

之前的代码错误使用全局最大token数,而非按Team+Year分组计算每组的最大token数量,导致结果不符合预期。

正确实现代码

# 计算每行字符串的token数量(按"-"拆分)
dt[, token_count := lengths(strsplit(Str, "-"))]

# 按Team和Year分组,获取每组的最大token数
dt[, max_tokens := max(token_count), by = .(Team, Year)]

# 生成Var列:token数等于组内最大则取最后一个token,否则设为NA
dt[, Var := ifelse(token_count == max_tokens, 
                   sapply(strsplit(Str, "-"), tail, n = 1), 
                   NA_character_)]

# 可选:删除中间辅助列
dt[, c("token_count", "max_tokens") := NULL]

代码说明

  • 先通过strsplit拆分字符串,用lengths统计每行的token数量,存入临时列token_count。
  • 按Team和Year分组,用max(token_count)计算每组的最大token数,存入max_tokens。
  • 用ifelse判断:如果当前行的token数等于组内最大值,就提取最后一个token;否则设为NA。
  • 最后可以删除临时的辅助列,让数据表更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:02