R语言按条件批量填充多列:为关联记录补充有效邮箱
用tidyverse实现分组批量填充有效邮箱列
示例输入数据
先构造符合需求的示例数据集:
library(tidyverse) df <- tibble( id2 = c(1,1,1,2,2,3), email = c("a@test.com", "-", "b@test.com", "c@test.com", "-", "-"), isValidEmail = c(1,0,1,1,0,0) )
实现代码
分两步完成批量填充:
# 第一步:提取每组有效邮箱并转为宽格式 valid_emails_wide <- df %>% # 筛选出有效邮箱记录 filter(isValidEmail == 1) %>% # 按id2分组 group_by(id2) %>% # 为每个有效邮箱生成带序号的列名 mutate(email_num = str_c("validEmail", row_number())) %>% # 转宽格式,每个id2对应一行,包含所有有效邮箱列 pivot_wider( id_cols = id2, names_from = email_num, values_from = email ) # 第二步:左连接回原数据集,完成全量填充 result <- df %>% left_join(valid_emails_wide, by = "id2")
代码说明
- 提取转宽:先过滤出
isValidEmail=1的记录,按id2分组后给每个有效邮箱生成带序号的列名(如validEmail1、validEmail2),再转成宽格式——每个id2对应一行,包含该组所有有效邮箱的列。 - 连接填充:把宽格式的有效邮箱表和原表按
id2左连接,无论原记录的邮箱是否有效,都会带上对应id2组的全部有效邮箱列;若某组无有效邮箱,对应列自动填充NA。
大规模数据适配
这套逻辑采用tidyverse中效率较高的核心函数(filter、group_by、pivot_wider),可适配大规模数据集的处理需求;若不同id2组的有效邮箱数量差异大,pivot_wider会自动为邮箱数量少的组补NA,保证结果一致性。
内容的提问来源于stack exchange,提问作者Paloma Rangel
相关产品推荐
相关产品推荐

