选择满足所需条件的分组样本

问题描述 投票:0回答:1

我有一个类似的数据框

raw.df <- data.frame(id = c("X01", "X02", "X03", "X04", "X05", "X06", "X07", "X08", "X09", "X10"),
           subject = c("S01", "S01", "S01", "S02", "S02", "S03", "S04", "S04", "S05", "S06"),
           time = c("D0", "D1", "D2", "D0", "D2", "D0", "D0", "D2", "D2", "D2"),
           response = c("Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "Y", "N"))

我想创建一个新列,为满足条件的样本添加“Y”,为其他样本添加“N”。如果任何响应=“Y”的受试者有来自时间 D0 和 D2 的两个样本,则应选择它们。基于此,我需要获取下面带有“选定”列的数据框。

final.df <- data.frame(id = c("X01", "X02", "X03", "X04", "X05", "X06", "X07", "X08", "X09", "X10"),
           subject = c("S01", "S01", "S01", "S02", "S02", "S03", "S04", "S04", "S05", "S06"),
           time = c("D0", "D1", "D2", "D0", "D2", "D0", "D0", "D2", "D2", "D2"),
           response = c("Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "Y", "N"),
           selected = c("Y", "N", "Y", "N", "N", "N", "Y", "Y", "N", "N"))

我可以使用 case_when by; 来选择样本而无需配对;

final.df <- raw.df %>%
  mutate(selected = case_when(time %in% c("D0", "D2") & response = "Y" ~ "Y",
                              TRUE ~ "N"))

为了配对,我可以使用另一个代码

final.df %>%
  filter(selected == "Y") %>%
  group_by(subject) %>%
  add_count() %>% ungroup() %>%
  mutate(n = if_else(n == 2, "Include", "Exclude")) %>%
  dplyr::rename(`paired` = n) 

然后我可以将它们结合起来,但我想知道是否有更好的组合解决方案

r dplyr case
1个回答
0
投票

一种方法可能是创建一个匹配案例表并加入其中。匹配的情况是,时间为 D0 或 D1,响应为 Y,每个受试者有两个不同的时间,即这两个时间中的每一个都至少有一个 Y。然后我在连接不匹配的地方输入 N。

raw.df |>
  left_join(
    raw.df |>
      filter(time %in% c("D0", "D2"), response == "Y") |>
      distinct(time, subject) |>
      filter(n() == 2, .by = subject) |>
      mutate(selected = "Y")) |>
  mutate(selected = coalesce(selected, "N"))

结果

    id subject time response selected
1  X01     S01   D0        Y        Y
2  X02     S01   D1        Y        N
3  X03     S01   D2        Y        Y
4  X04     S02   D0        N        N
5  X05     S02   D2        N        N
6  X06     S03   D0        Y        N
7  X07     S04   D0        Y        Y
8  X08     S04   D2        Y        Y
9  X09     S05   D2        Y        N
10 X10     S06   D2        N        N
© www.soinside.com 2019 - 2024. All rights reserved.