R语言data.table列操作:id匹配、排序及group值替换高效实现
基于data.table的高效实现方案
所有操作均使用data.table原生语法,按引用修改避免不必要的内存拷贝,适配大数据量处理场景。
library(data.table) # 先统一group列类型为整数,消除factor层级限制,避免后续操作报错 dt.2018[, group := as.integer(as.character(group))] dt.2019[, group := as.integer(as.character(group))]
步骤1:删除dt.2019中id不存在于dt.2018的整行数据
使用data.table半连接实现,性能远高于基础包的%in%判断,大数据量下优势更明显:
dt.2019 <- dt.2019[dt.2018, on = .(id), nomatch = NULL]
步骤2:追加dt.2018独有id行到dt.2019,新增行group设为8
用反连接取出dt.2018独有的id行,修改group值后合并:
# 提取dt.2018有、dt.2019没有的id对应行 add_rows <- dt.2018[!dt.2019, on = .(id)] # 修改新增行的group为8 add_rows[, group := 8] # 追加到dt.2019 dt.2019 <- rbind(dt.2019, add_rows)
步骤3:两个表按id列排序,保证相同id行索引一致
使用setkey按引用排序,无需复制全表数据,效率极高:
setkey(dt.2018, id) setkey(dt.2019, id)
步骤4:替换dt.2019的group取值
用fcase实现批量匹配替换,逻辑清晰且性能优异:
dt.2019[, group := fcase( group == 0, 4L, group == 1, 5L, group == 2, 6L, group == 3, 7L, group == 8, 8L )]
运行完成后可执行print(dt.2019)核对结果是否符合预期。
内容的提问来源于stack exchange,提问作者Miko
相关产品推荐
相关产品推荐

