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

