我有一个类似的数据框
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)
然后我可以将它们结合起来,但我想知道是否有更好的组合解决方案
一种方法可能是创建一个匹配案例表并加入其中。匹配的情况是,时间为 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