有条件地粘贴 R 中不同列的值(忽略 NA)

Conditional pasting of values from different columns in R (ignoring NAs)

我有一个患有某些疾病 (Diag_main) 的患者的数据集。其中一些疾病具有亚类诊断(Diag_subgroup_CBSDiag_subgroup_PPA)。例如,在 Diag_main 中具有值 =CBS 的个体将具有相应的类型 1 或类型 2 值(在 Diag_subgroup_CBS 中)并且在 Diag_main 中具有值 =PPA 的个体将具有 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 没有忽略 NAs。

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

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