首页 > 解决方案 > 使用 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 中的值。规则如下:

  1. 如果 USUBJID 有任何完整响应 (CR),则该 USUBJID 的所有 BOR 都应该是 CR。
  2. 否则,如果 USUBJID 有任何部分响应 (PR),则该 USUBJID 的所有 BOR 都应该是 PR。
  3. 否则,如果 USUBJID 有任何稳定的疾病 (SD),则该 USUBJID 的所有 BOR 都应为 SD。
  4. 否则分配 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]

标签: rdata.table

解决方案


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类似的行为并且在开发版本下可用。


推荐阅读