使用data.table为分组缺失的Variable_codes_2022生成递增编码
解决思路与代码实现
核心逻辑
按Survey分组,提取每组已存在编码的数字部分,找到最大值后,给该组的NA行分配从最大值+1开始的递增编码,拼接对应分组的前缀字符即可。
具体代码
library(data.table) dat <- fread("Survey Variable_codes_2022 D D1 A A1 B B1 B B3 B B2 E E1 B NA E NA") # 按Survey分组填充NA编码 dat[, { # 提取现有非NA编码的数字部分并转成整数 existing_digits <- as.integer(gsub("[^0-9]", "", Variable_codes_2022[!is.na(Variable_codes_2022)])) # 确定当前组的最大数字(无现有编码时默认0) max_digit <- if (length(existing_digits) == 0) 0 else max(existing_digits) # 定位NA行并生成新编码 na_pos <- which(is.na(Variable_codes_2022)) if (length(na_pos) > 0) { new_codes <- paste0(Survey[1], max_digit + seq_along(na_pos)) Variable_codes_2022[na_pos] <- new_codes } .SD }, by = Survey]
代码说明
- 分组处理:通过
by = Survey确保每个分组独立计算,不会互相干扰 - 提取数字:用
gsub("[^0-9]", "", ...)过滤掉编码中的非数字字符,再转成整数类型,不管原编码数字的排列顺序,只取最大值作为起始点 - 生成新编码:对每组的NA行,按顺序生成
最大值+1、最大值+2...的数字,拼接分组前缀(如B、E)后替换NA值
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

