如何基于唯一值优先使用case_when创建新变量——R语言数据框处理求助
我来帮你搞定这个问题~你的核心需求是根据ID的重复情况、bp和N的值生成frequency变量,之前的代码没处理好仅含bp=no的唯一ID的场景,我们一步步来修正:
先说说你原有代码的问题
- 你错误地修改了
bp变量,而不是新建目标变量frequency; duplicated(ID)只能判断当前行是否是重复出现的ID,无法精准识别「该ID是否完全没有bp=yes的记录」;- R是大小写敏感的,你写的
n应该是数据框里的N,这会导致条件判断失效。
正确的解决方案代码
我们用dplyr分组处理,先标记每个ID是否存在bp=yes的记录,再按规则赋值:
library(dplyr) # 先构造你的示例数据(方便测试) x <- tibble( ID = c(8012199,8012199,8012211,8012211,8012321,8012341,8012342), bp = c("no","yes","no","yes","no","no","no"), N = c(75,2,118,4,37,146,84) ) # 处理逻辑 x_processed <- x %>% group_by(ID) %>% mutate( # 临时标记:当前ID是否存在bp=yes的记录 has_yes_record = any(bp == "yes"), # 按你的三个条件生成frequency frequency = case_when( bp == "yes" & N <= 2 ~ "low", bp == "yes" & N > 2 ~ "high", # 没有yes记录的ID,所有行都赋值low !has_yes_record ~ "low", # 有yes记录的ID里的no行,留空(用NA表示) TRUE ~ NA_character_ ) ) %>% ungroup() %>% # 删掉临时变量,保持数据整洁 select(-has_yes_record) # 查看结果 x_processed
运行结果(和你的预期完全匹配)
# A tibble: 7 × 4 ID bp N frequency <dbl> <chr> <dbl> <chr> 1 8012199 no 75 NA 2 8012199 yes 2 low 3 8012211 no 118 NA 4 8012211 yes 4 high 5 8012321 no 37 low 6 8012341 no 146 low 7 8012342 no 84 low
逻辑解释
group_by(ID):把同一个ID的记录归为一组,方便判断该ID的整体属性;has_yes_record:用any(bp == "yes")快速判断当前ID是否存在yes的记录;case_when按优先级判断:先处理bp=yes的两种情况,再处理完全没有yes记录的ID,最后给有yes记录的no行留空。
内容的提问来源于stack exchange,提问作者lana
相关产品推荐
相关产品推荐

