r - 使用 data.table 在 r 中分配最佳响应
问题描述
我有一个这样的数据集:
dt <- data.table(USUBJID = c(rep("001-001", 4), rep("001-002", 4), rep("001-003", 3)),BOR_candidate = c(NA,"CR","CR","SD",NA,"SD","SD","N",NA,"SD","SD"))
我想要做的是通过每个 USUBJID 检测 BOR_candidate 中的值。规则如下:
- 如果 USUBJID 有任何完整响应 (CR),则该 USUBJID 的所有 BOR 都应该是 CR。
- 否则,如果 USUBJID 有任何部分响应 (PR),则该 USUBJID 的所有 BOR 都应该是 PR。
- 否则,如果 USUBJID 有任何稳定的疾病 (SD),则该 USUBJID 的所有 BOR 都应为 SD。
- 否则分配 N。
所以我想要的结果是这样的:
dt <- data.table(USUBJID = c(rep("001-001", 4), rep("001-002", 4), rep("001-003", 3)),
BOR_candidate = c(NA,"CR","CR","SD",NA,"SD","SD","N",NA,"SD","SD"),
BOR = c(rep("CR", 4), rep("SD", 4), rep("SD", 3)))
我已经尝试了下面的代码,但它没有达到我想要的效果。任何建议将不胜感激。提前致谢。
dt[,BORR := ifelse(grepl("CR", dt[,2]),"CR",ifelse(grepl("PR",dt[,2]),"PR",ifelse(grepl("SD",dt[,2]), "SD", "N"))),by = USUBJID]
解决方案
在dplyr
中,我们可以group_by
和使用case_when
来检查各种条件。
library(dplyr)
dt %>%
group_by(USUBJID) %>%
mutate(BOR = case_when(any(BOR_candidate == "CR") ~ "CR",
any(BOR_candidate == "PR") ~ "PR",
any(BOR_candidate == "SD") ~ "SD",
TRUE ~ "N"))
# USUBJID BOR_candidate BOR
# <chr> <chr> <chr>
# 1 001-001 NA CR
# 2 001-001 CR CR
# 3 001-001 CR CR
# 4 001-001 SD CR
# 5 001-002 NA SD
# 6 001-002 SD SD
# 7 001-002 SD SD
# 8 001-002 N SD
# 9 001-003 NA SD
#10 001-003 SD SD
#11 001-003 SD SD
data.table
具有fcase
类似的行为并且在开发版本下可用。
推荐阅读
- java - 如何解析kafka流中的kafka标头?
- curl - Centos 7 上的 CURL 出现 NSS 错误 -12188
- html - 在 Flexbox 上使用定位和边距?
- reactjs - 为什么 React 中的 Todo List 总是删除最后一项?
- android - moxy 和 dagger2 依赖注入问题
- php - PHPMailer 给我一个致命错误,但我不知道为什么
- r - 为什么X轴不能正确显示日期?
- c# - wpf 使用静态标志更新视图模型中的属性
- linux - 如何在设备树中指定 gpiochip 的名称?
- python - 在python的while循环中使用continue