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

基于多变量规则对ID字段重编码以关联个体的技术需求

解决方案:将就诊ID替换为个体唯一ID

针对你的需求——把重复就诊(re-do)记录的ID替换为对应首次就诊(first)的ID,我提供两种高效的实现方式,适配你15万+行的数据集规模:

方法一:使用dplyr(代码易读,适合大多数场景)

首先加载dplyr包,然后通过筛选参考表+连接匹配+条件更新的逻辑完成ID重编码:

library(dplyr)

# 1. 提取所有首次就诊记录作为匹配参考表
first_records <- df %>%
  filter(Order == "first") %>%
  select(Name, Age, Group, Site, first_ID = ID, first_Date = Date)

# 2. 连接原数据与参考表,按条件更新ID
updated_df <- df %>%
  left_join(first_records, by = c("Name", "Age", "Group", "Site")) %>%
  # 仅对符合条件的re-do行替换ID
  mutate(ID = ifelse(Order == "re-do" & Date > first_Date, first_ID, ID)) %>%
  # 清理临时字段
  select(-first_ID, -first_Date)

# 查看结果
print(updated_df)

逻辑说明

这个方案完全满足你的所有条件:

  • 仅从Order = "first"的行获取ID:first_records只筛选了首次就诊记录
  • 仅更新Order = "re-do"的行:ifelse明确限定了更新范围
  • 严格匹配Name、Age、Group、Site:通过left_join的连接键实现精准匹配
  • 确保re-do日期晚于first日期:Date > first_Date的判断保证时间顺序正确

方法二:使用data.table(性能更优,适合超大数据集)

如果你的数据集处理速度要求更高,推荐用data.table,它的连接和更新操作在大数据量下比dplyr更快:

library(data.table)

# 转换为data.table格式
setDT(df)

# 提取首次就诊参考表
first_records <- df[Order == "first", .(Name, Age, Group, Site, first_ID = ID, first_Date = Date)]

# 按条件匹配并更新ID
updated_df <- df[first_records, on = .(Name, Age, Group, Site), 
                 ID := fifelse(Order == "re-do" & Date > first_Date, first_ID, ID)]

# 查看结果
print(updated_df)

运行上述代码后,你会得到和期望完全一致的数据集,两种方法都能高效处理15万行的规模,可根据自己的代码习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:11