r - 使用 dplyr::mutate/mutate_if 的具有多个条件的 Ifelse 语句

标签 r dplyr data-manipulation

我想创建一个新变量,如果一组变量中的任何变量为 10,则该变量为 1 > 否则,使用dplyr::mutate 和基本any 函数。

数据集:

df <- structure(list(ID = 1:2, METFORMIN = c(0L, 0L), SULPHONYLUREA = c(0L, 0L), MEGLITINIDE = c(0L, 0L), ACARBOSE = c(0L, 0L),
                     THIAZOLIDINEDIONE = c(0L, 0L), DPP4_INHIBITOR = c(0L, 0L), SGLT2_INHIBITOR = c(1L, 1L), GLP1_RA = c(0L, 0L)), 
                .Names = c("ID", "METFORMIN", "SULPHONYLUREA", "MEGLITINIDE", "ACARBOSE", "THIAZOLIDINEDIONE", "DPP4_INHIBITOR",
                           "SGLT2_INHIBITOR", "GLP1_RA"), class = "data.frame", row.names = c(NA, -2L))

数据结构:

 #  ID METFORMIN SULPHONYLUREA MEGLITINIDE ACARBOSE THIAZOLIDINEDIONE DPP4_INHIBITOR SGLT2_INHIBITOR GLP1_RA
 #  1          0             0           0        0                 0              0               1       0
 #  2          0             0           0        0                 0              0               1       0

所需的数据结构:

 #  ID METFORMIN SULPHONYLUREA MEGLITINIDE ACARBOSE THIAZOLIDINEDIONE DPP4_INHIBITOR SGLT2_INHIBITOR GLP1_RA ORALDM
 #  1          0             0           0        0                 0              0               1       0      1
 #  2          0             0           0        0                 0              0               1       0      1

代码 1:

df %>% mutate(ORALDM = if_else(any(METFORMIN:GLP1_RA) == 1, 1, 0))

这不会给出所需的输出并产生错误:

Warning messages: 1: In METFORMIN:GLP1_RA : numerical expression has 2 elements: only the first used 2: In METFORMIN:GLP1_RA : numerical expression has 2 elements: only the first used

代码2:

df %>% mutate_if(predicate(any(METFORMIN:GLP1_RA) == 1), 1)

这也会产生错误:

Error in predicate(any(METFORMIN:GLP1_RA) == 1) : could not find function "predicate"

最佳答案

将我的评论提升为答案。与:

df %>% mutate(ORALDM = +(rowSums(.[2:9]) > 0))

或 with(当您想使用变量名称时):

df %>% mutate(ORALDM = +(rowSums(select(df, METFORMIN:GLP1_RA)) > 0))

你得到:

  ID METFORMIN SULPHONYLUREA MEGLITINIDE ACARBOSE THIAZOLIDINEDIONE DPP4_INHIBITOR SGLT2_INHIBITOR GLP1_RA ORALDM
1  1         0             0           0        0                 0              0               1       0      1
2  2         0             0           0        0                 0              0               1       0      1

实现相同的想法:

library(data.table)
dt <- setDT(copy(df))

dt[, ORALDM := +(rowSums(.SD) > 0), .SDcols = METFORMIN:GLP1_RA][]

注意:除了使用 +,您还可以使用 as.integeras.numeric

关于r - 使用 dplyr::mutate/mutate_if 的具有多个条件的 Ifelse 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653963/

相关文章:

r - R 中矩阵下的匹配(查找)

r - 如何检查一个向量是否是斐波那契数列

r - 使用 grep 查找 "cancer"但排除 "previous cancer"

r - 根据谓词函数使元素成为 NA

r - 将多个分组索引连接成一个

R:使用 dplyr 过滤 data.table 失败

R - 融合配对数据的 dplyr 交叉表

r - 如何计算逻辑向量中的 TRUE 值

python - 使用python将字符数组转换为整数

R:根据其他变量创建新变量(错误:由 coercion 引入的 NA)