首页 > 解决方案 > 使用 dplyr 将列的值与每组中的参考值进行比较

问题描述

我有一个看起来像这样的 data.frame

df <- data.frame(id=c(1,1,1,2,2,2), outcome=c(0.1,0.2,0.3,0.1,0.2,0), 
                 type=c("trt1","trt2", "control","trt1","trt2", "control"))

  id outcome type
1  1     0.1 trt1
2  1     0.2 trt2
3  1     0.3 control
4  2     0.1 trt1
5  2     0.2 trt2
6  2     0.0 control

我想在每组中将 trt1 和 trt2 的结果值与对照的结果值进行比较。如果控件的结果值更大或相等,我需要一个带有 yes 指示的新列,如果不是 no 指示。

期望的结果是这样的。

  id outcome type   new.col
1  1     0.1 trt1     yes
2  1     0.2 trt2     yes
3  1     0.3 control  yes or NA (optional)
4  2     0.1 trt1     no
5  2     0.2 trt2     no
6  2     0.0 control  no or NA (optional)

我为此苦苦挣扎,感谢您的帮助。

标签: rdplyrtidyverse

解决方案


使用case_when-

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(new.col = case_when(type == 'control' ~ NA_character_,
                            outcome[type == 'control'] >= outcome ~ 'yes',
                            TRUE ~ 'no')) %>%
  ungroup

#    id outcome type    new.col
#  <dbl>   <dbl> <chr>   <chr>  
#1     1     0.1 trt1    yes    
#2     1     0.2 trt2    yes    
#3     1     0.3 control NA     
#4     2     0.1 trt1    no     
#5     2     0.2 trt2    no     
#6     2     0   control NA     

推荐阅读