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

在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

代码逻辑说明

  1. 先通过嵌套分组,计算每个邮箱在对应id+姓名组内的出现次数,存储为临时变量email_freq;
  2. 回到id+姓名的分组维度,用case_when分情况赋值:
    • 当组内邮箱唯一时,所有行统一标记"Yes";
    • 当邮箱在组内出现多次时,标记"Yes";
    • 仅出现一次的异邮箱标记"No";
  3. 最后取消分组并清理临时变量,得到符合需求的数据集。

内容的提问来源于stack exchange,提问作者Maleeha Shahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:50:30