如何根据id列的重复数字与字符条件将statut列设为NA?
解决方法:根据ID数字部分重复情况修改statut列值
首先是你的示例数据:
df = data.frame(id = c('1E','1F','2E','2F','3F','4F'), statut = c('A','A','B','B','A','A') )
需求明确:找出数字部分重复的ID,当这类ID的字母为E时,将对应statut设为NA。
方法一:使用tidyverse工具链
需要用到dplyr做数据处理,stringr处理字符串:
library(dplyr) library(stringr) df_processed <- df %>% # 提取ID里的数字部分作为临时分组依据 mutate(num_part = str_extract(id, "\\d+"), # 分组判断:同一数字组内有多个ID,且当前ID含E时,statut设为NA statut = ifelse(n() > 1 & str_detect(id, "E"), NA, statut), .by = num_part) %>% # 移除临时生成的num_part列 select(-num_part)
方法二:使用Base R实现
不用额外加载包,直接用基础函数处理:
# 提取每个ID的数字部分 num_part <- gsub("[A-Z]", "", df$id) # 统计每个数字部分的出现次数 num_counts <- table(num_part) # 筛选出出现次数大于1的数字部分 repeat_numbers <- names(num_counts[num_counts > 1]) # 定位到数字重复且字母为E的行,将statut设为NA df$statut[df$id %in% paste0(repeat_numbers, "E")] <- NA
两种方法都能得到你想要的结果:
df_processed # 或者直接查看修改后的df #> id statut #> 1 1E <NA> #> 2 1F A #> 3 2E <NA> #> 4 2F B #> 5 3F A #> 6 4F A
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

