有条件地粘贴 R 中不同列的值(忽略 NA)
Conditional pasting of values from different columns in R (ignoring NAs)
我有一个患有某些疾病 (Diag_main
) 的患者的数据集。其中一些疾病具有亚类诊断(Diag_subgroup_CBS
或 Diag_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
我有一个患有某些疾病 (Diag_main
) 的患者的数据集。其中一些疾病具有亚类诊断(Diag_subgroup_CBS
或 Diag_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