r - 有条件地粘贴来自 R 中不同列的值(忽略 NA)
问题描述
我有一个患有某些疾病的患者数据集 ( Diag_main
)。其中一些疾病具有亚分类诊断(Diag_subgroup_CBS
或Diag_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。
我不明白为什么这段代码不起作用。最快和最有效的方法是什么?
解决方案
写条件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
推荐阅读
- javascript - 表不再更新到 Firebase,React
- amazon-web-services - 当 Internet 地址与 VPC 内部地址冲突时,AWS 如何确定目标
- reactjs - 如何根据同一周期的状态有条件地运行 useEffect
- python - 用户第一次猜错但输入正确后如何返回打印功能“You win”
- php - Laravel 急切加载问题。如何修复收到的 N+1 警告?
- android - 录像模式屏幕不适合手机屏幕
- c# - 非常大的文件上传到 webDAV 会导致 tomcat OOM 错误
- wordpress - 如何修复 Wordpress 的“您的网站出现严重错误”
- javascript - 带有承诺链的nodejs类的单元测试
- openid-connect - OIDC 1.0 声明的大小和数量是否有限制?