r - 使用 dplyr::mutate/mutate_if 的具有多个条件的 ifelse 语句
问题描述
我想创建一个新变量,这样1
如果一组变量中的任何变量是1
或0
否则,使用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))
这不会提供所需的输出并产生错误:
警告消息: 1:在 METFORMIN:GLP1_RA 中:数值表达式有 2 个元素:仅使用第一个 2:在 METFORMIN:GLP1_RA 中:数值表达式有 2 个元素:仅使用第一个
代码 2:
df %>% mutate_if(predicate(any(METFORMIN:GLP1_RA) == 1), 1)
这也会产生错误:
谓词错误(any(METFORMIN:GLP1_RA)== 1):找不到函数“谓词”
解决方案
将我的评论推广到答案。和:
df %>% mutate(ORALDM = +(rowSums(.[2:9]) > 0))
或使用(当您想使用变量名时):
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
用data.table实现了同样的想法:
library(data.table)
dt <- setDT(copy(df))
dt[, ORALDM := +(rowSums(.SD) > 0), .SDcols = METFORMIN:GLP1_RA][]
注意:+
除了使用 ,您还可以使用as.integer
or as.numeric
。
推荐阅读
- mongodb - 在 spark + hdfs + mongo 环境中实现单元测试
- fpm - PHP-FPM 无法关闭
- log4j2 - How to set log4j2.json configuration.properties.property default value
- c++ - 如何读取 google::protobuf::io::CodedOutputStream::WriteVarint32ToArray 写入的数据
- scala - 如何从列表中创建火花数据框
- json - Clover ETL中提取json数据
- c# - 如何序列化已使用 XmlTextReader { Namespaces = false } 读取的 XML?
- java - 键盘隐藏 BottomSheetDialog
- javascript - 使用 javascript 更改标签以使用选定的选项值
- android - 如何检测android中的通知?