在R中使用dplyr::mutate与case_when创建身份标识变量
用dplyr::mutate结合case_when创建identity变量的解决方案
我们可以通过分组判断组内邮箱的分布情况,来生成目标identity变量。核心逻辑是:按id、last_name、first_name分组后,若组内所有邮箱一致则全标记"Yes";若存在多种邮箱,出现多次的邮箱对应行标记"Yes",仅出现一次的标记"No"。
实现代码
library(dplyr) # 示例数据集 id <- c("12-A", "12-A", "12-A", "12-A") last_name <- c("Mike", "Mike", "Mike", "Mike") first_name <- c("Tom", "Tom", "Tom", "Tom") email <- c("tom@yahoo.com", "tom@yahoo.com", "tom@yahoo.com", "tommike@yahoo.com") ds <- data.frame(id, last_name, first_name, email) # 创建identity变量 ds_processed <- ds %>% # 按id、姓名、邮箱分组,计算每个邮箱在对应姓名组内的出现次数 group_by(id, last_name, first_name, email) %>% mutate(email_freq = n()) %>% # 回到id+姓名的分组,通过case_when判断标记 group_by(id, last_name, first_name) %>% mutate( identity = case_when( # 组内仅有一种邮箱,全标记Yes n_distinct(email) == 1 ~ "Yes", # 邮箱在组内出现多次,标记Yes email_freq > 1 ~ "Yes", # 其余情况(仅出现一次的异邮箱)标记No TRUE ~ "No" ) ) %>% # 取消分组,移除中间变量(可选操作) ungroup() %>% select(-email_freq) # 查看处理后的结果 print(ds_processed)
运行结果
id last_name first_name email identity 1 12-A Mike Tom tom@yahoo.com Yes 2 12-A Mike Tom tom@yahoo.com Yes 3 12-A Mike Tom tom@yahoo.com Yes 4 12-A Mike Tom tommike@yahoo.com No
代码逻辑说明
- 先通过嵌套分组,计算每个邮箱在对应
id+姓名组内的出现次数,存储为临时变量email_freq; - 回到
id+姓名的分组维度,用case_when分情况赋值:- 当组内邮箱唯一时,所有行统一标记"Yes";
- 当邮箱在组内出现多次时,标记"Yes";
- 仅出现一次的异邮箱标记"No";
- 最后取消分组并清理临时变量,得到符合需求的数据集。
内容的提问来源于stack exchange,提问作者Maleeha Shahid
相关产品推荐
相关产品推荐

