如何批量将存在矛盾吸烟状态的重复ID对应的状态值转为NA?
批量修正矛盾的吸烟状态数据
方法一:用dplyr包处理
这是tidyverse生态下的常用方法,代码简洁易读:
library(dplyr) # 按ID分组,判断每组是否存在矛盾状态,有则设为NA test_cleaned <- test %>% group_by(ID) %>% mutate(Smoking.Status = ifelse(n_distinct(Smoking.Status, na.rm = TRUE) > 1, NA, Smoking.Status)) %>% ungroup()
逻辑说明:
group_by(ID):按用户ID分组n_distinct(Smoking.Status, na.rm = TRUE):统计每组内非NA的吸烟状态种类数- 如果种类数大于1,说明该用户的状态存在矛盾,将所有状态值替换为NA;否则保留原状态
方法二:用Base R原生函数处理
不想加载额外包的话,用ave函数就能实现相同效果:
# 按ID分组处理状态 test$Smoking.Status <- ave(test$Smoking.Status, test$ID, FUN = function(x) { # 统计每组非NA的唯一状态数,大于1则设为NA if (length(unique(na.omit(x))) > 1) NA else x })
用你提供的测试数据验证,处理后ID为123的两条记录的Smoking.Status都会被替换成NA,批量处理所有矛盾ID也完全适用。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

