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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:33:14