首页 > 解决方案 > 有条件地粘贴来自 R 中不同列的值(忽略 NA)

问题描述

我有一个患有某些疾病的患者数据集 ( Diag_main)。其中一些疾病具有亚分类诊断(Diag_subgroup_CBSDiag_subgroup_PPA)。例如,值 =CBS in 的个体Diag_main将具有对应的类型 1 或类型 2 值 (in Diag_subgroup_CBS),值 =PPA in 的个体Diag_main将具有 PPA-A 或 PPA-B。

示例数据:

df<-data.frame(
  id=c(1:7), 
  Diag_main=c('BBA', 'CBS', 'PPA', 'AM', 'CBS', 'PPA', 'BBA'), 
  Diag_subgroup_CBS=c(NA, '0', NA, NA, '1', NA, NA), 
  Diag_subgroup_PPA=c(NA, NA, '0', NA, NA, NA, '1')
)

我在找什么:

我想创建一个新列 ( Diag_combined),它 (i) 用于 CBS:将 0 重新编码为 Type1,将 1 重新编码为 Type2,(ii) 对于 PPA:将 0 重新编码为 PPA-A,1 重新编码为 PPA-B,(iii) CBS 或 PPA 粘贴其子组值(即 Type1、PPA-A 等)和 (ii) 对于没有 CBS 或 PPA 的个人,粘贴其Diag_main值。

df2<-data.frame(
  id=c(1:7), 
  Diag_main=c('BBA', 'CBS', 'PPA', 'AM', 'CBS', 'PPA', 'BBA'), 
  Diag_subgroup_CBS=c(NA, '0', NA, NA, '1', NA, NA), 
  Diag_subgroup_PPA=c(NA, NA, '0', NA, NA, NA, '1'), 
  Diag_combined=c('BBA', 'Type1', 'PPA-A', 'AM', 'Type2', 'PPA-B', 'BBA')
)

我尝试dplyr::mutate使用以下代码执行此操作:

df3 <- mutate(df,
  Diag_combined=ifelse(grepl('0', Diag_subgroup_CBS), 'Type1', 
                       ifelse(grepl('1', Diag_subgroup_CBS), 'Type2',  
                              ifelse(grepl('0', Diag_subgroup_PPA), 'PPA-A', 
                                     ifelse(grepl('1', Diag_subgroup_PPA), 'PPA-B', Diag_main))))))

当我运行它时,我收到错误说明Problem with 'mutate()' column 'Diag_combined'. The error occurred in Diag_combined: id = 1.。我不知道这是否是因为dplyr::mutate没有忽略 NA。

我不明白为什么这段代码不起作用。最快和最有效的方法是什么?

标签: rdataframeconditional-formattingdplyr

解决方案


写条件case_when()结合mutate()

df %>%
mutate(Diag_combined = case_when(Diag_main == 'BBA' ~ 'BBA',
                                Diag_main == 'CBS' & Diag_subgroup_CBS == 0 ~ 'Type1',
                                Diag_main == 'PPA' & Diag_subgroup_PPA == 0 ~ 'PPA-A',
                                Diag_main == 'AM' ~ 'AM',
                                Diag_main == 'CBS' & Diag_subgroup_CBS == 1 ~ 'Type2',
                                Diag_main == 'PPA' & is.na(Diag_subgroup_CBS) & is.na(Diag_subgroup_PPA) ~ 'PPA-B') %>% as.factor)

输出;

id Diag_main Diag_subgroup_CBS Diag_subgroup_PPA Diag_combined
  <int> <fct>     <fct>             <fct>             <fct>        
1     1 BBA       NA                NA                BBA          
2     2 CBS       0                 NA                Type1        
3     3 PPA       NA                0                 PPA-A        
4     4 AM        NA                NA                AM           
5     5 CBS       1                 NA                Type2        
6     6 PPA       NA                NA                PPA-B        
7     7 BBA       NA                1                 BBA  

推荐阅读