首页 > 解决方案 > 使用 case_when 长格式数据集 dplyr 进行变异

问题描述

假设我有一个收集所有医疗咨询的数据集。由于我有一些时间间隔,我将测量 1,2,...,n。

现在我想将在第一个测量点(基线)获得的结果与下一个结果进行比较。如果第二,第三,第四(等)测量差异小于0.5,这个结果是可以的;但如果不存在差异,则结果不正确。

当我们拥有宽格式的数据集时,这是一个简单的操作,但我正在 dplyr 框架中使用长格式。

我的数据集如下所示:

数据集

我认为这个方向的事情可能没问题,但是我收到了一些错误消息..

ds <- ds %>% 
  group_by(id) %>% 
  mutate(
    improvement = 
      case_when(result[time != "Baseline"] - result[time == "Baseline"] <= 0.5 ~ 1)
  )

要重现分析:

ds <- structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 
                              4, 4, 5, 5, 5, 6, 6, 6), group = c("AG", "AG", "AG", 
                                                                         "AG", "AG", "AG", "AG", "AG", "AG", "BG", "BG", "BG", "BG", "BG", 
                                                                         "BG", "BG", "BG", "BG"), time = structure(c(1L, 2L, 3L, 1L, 2L, 
                                                                                                                     3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("Baseline", 
                                                                                                                                                                                     "Post-intervention", "3-month follow-up"), class = "factor"), 
                     result = c(1.2, 0.2, 0.2, 0.7, 0.2, 0.2, 1, 0.2, 0.2, 0.7, 
                               0.9, 0.5, 1, 0.6, 0.2, 3.3, 0.2, 0.2)), class = c("tbl_df", 
                                                                                 "tbl", "data.frame"), row.names = c(NA, -18L))
d

标签: rdplyr

解决方案


case_when期望参数具有相同的长度。如果我们做子集,它可能会触发反应,因为其中一个组件的长度不匹配。按“id”分组后的一个选项是从“时间”为“基线”的情况中减去“结果”(以处理有多个“基线”重复项的情况,取第一个元素),减去和做比较

library(dplyr)
ds %>% 
   group_by(id) %>%
   mutate(improvement = case_when(result - result[time == "Baseline"][1] <= 0.5 ~ 1, 
           TRUE ~ NA_real_))

推荐阅读