在R中基于PassengerId组填充NA值(SpaceTitanic竞赛场景)
高效填充同组缺失值的R实现方案
针对你在SpaceTitanic竞赛中遇到的同组(PassengerId前4位相同)缺失值填充需求,以下是两种比多对象连接更简洁高效的实现方式:
方法一:使用dplyr(tidyverse生态)
先构造示例数据:
library(dplyr) df <- tibble( PassengerId = c('0001_01', '0003_01', '0003_02'), HomePlanet = c('Europa', 'Mars', NA) )
核心步骤:提取PassengerId前4位作为分组标识,按分组用组内非缺失值填充NA。
实现代码(精准取组内非NA值填充):
df_filled <- df %>% mutate(group_id = str_sub(PassengerId, 1, 4)) %>% # 提取前4位作为组ID group_by(group_id) %>% mutate(HomePlanet = ifelse(is.na(HomePlanet), first(na.omit(HomePlanet)), HomePlanet)) %>% ungroup() %>% select(-group_id) # 可选:移除临时分组列
如果组内非NA值位置不固定,可使用双向填充覆盖所有组内NA:
df_filled <- df %>% mutate(group_id = str_sub(PassengerId, 1, 4)) %>% group_by(group_id) %>% fill(HomePlanet, .direction = "downup") %>% # 先向下再向上填充,覆盖所有NA ungroup() %>% select(-group_id)
方法二:使用data.table(大数据场景更高效)
如果数据集规模较大,data.table的内存效率和运算速度会更有优势:
library(data.table) dt <- data.table( PassengerId = c('0001_01', '0003_01', '0003_02'), HomePlanet = c('Europa', 'Mars', NA) ) # 提取分组ID并完成双向填充 dt[, group_id := substr(PassengerId, 1, 4)] dt[, HomePlanet := nafill(HomePlanet, type = "locf"), by = group_id] # 向下填充 dt[, HomePlanet := nafill(HomePlanet, type = "nocb"), by = group_id] # 向上填充 dt[, group_id := NULL] # 移除临时分组列
这两种方法都无需创建多个中间对象,直接在原数据结构内完成分组和填充,代码更简洁且性能更优。
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

