R语言根据user列匹配填充user_type列NA值的方法
R语言按user对应关系填充user_type列NA值实现方案
核心逻辑:先提取所有非NA记录中user与user_type的唯一映射关系,再基于映射匹配填充所有NA位置,适配「相同user对应唯一固定user_type」的业务规则。
第一步:构造示例测试数据
先把示例数据写成R可直接运行的格式,方便调试:
df <- data.frame( user = c(123, 124, 125, 124, 123, 125), user_type = c("emp", "man", "man", NA, NA, NA) )
可选实现方法
方法1:dplyr分组填充(日常数据处理首选)
按user分组后,直接取组内第一个非NA的user_type覆写整列即可,不用单独构造映射表,代码最简洁:
library(dplyr) df_filled <- df %>% group_by(user) %>% # 同组user_type唯一,去掉NA后取第一个值就是正确映射值 mutate(user_type = first(na.omit(user_type))) %>% ungroup()
方法2:构造映射表匹配填充(通用性最强)
先单独提取合法的映射关系,再做匹配替换,哪怕映射规则是外部单独提供、不是从原数据提取的场景也能适用:
library(dplyr) # 1. 提取无重复的user-user_type映射对 user_mapping <- df %>% filter(!is.na(user_type)) %>% distinct(user, user_type) # 2. 仅替换原数据中取值为NA的位置,已有合法值的位置保留不动 df_filled <- df %>% mutate( user_type = ifelse( is.na(user_type), user_mapping$user_type[match(user, user_mapping$user)], user_type ) )
方法3:基础R实现(无需加载第三方包)
不想安装加载tidyverse等第三方包的时候,可以直接用基础R函数实现相同效果:
# 提取有效映射关系 user_mapping <- unique(na.omit(df)) # 定位所有NA值的位置,匹配对应映射值完成填充 df$user_type[is.na(df$user_type)] <- user_mapping$user_type[ match(df$user[is.na(df$user_type)], user_mapping$user) ]
结果校验&注意事项
- 跑完上述任意一种方法,最终填充完成的数据结果如下:
| user | user_type |
|---|---|
| 123 | emp |
| 124 | man |
| 125 | man |
| 124 | man |
| 123 | emp |
| 125 | man |
- 异常校验提示:正式填充前可以先检查是否存在同user对应多个不同user_type的脏数据,执行
any(duplicated(user_mapping$user)),如果返回TRUE说明存在冲突映射,需要先排查原始数据问题再填充,避免赋值错误。
内容的提问来源于stack exchange,提问作者user2845095
相关产品推荐
相关产品推荐

