Это расширение вопроса, который я задал здесь , где я искал способ автоматизировать маркировку предметов в группы на основе того, соответствуют ли их данные моему фильтру.
До попытки автоматизировать маркировку, это то, что я имел.
library(tidyverse)
df <- structure(list(Subj_ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L),
Location = c(1, 2, 3, 1, 4, 2, 1, 2, 5)), class = "data.frame",
row.names = c(NA, -9L))
df2 <- df %>%
mutate(group=
if_else(Subj_ID ==1,
"Treatment",
if_else(Subj_ID == 2,
"Control","Withdrawn")))
complete.df <- df2 %>% filter(complete.cases(.))
В моих фактических данных есть несколько строк, в которых есть NA, и мне нужно иметь возможность фильтровать как полные, так и неполные случаи, чтобы при необходимости я мог просматривать наборы под-данных отдельно. Мой новый код выглядит следующим образом: он присваивает субъект группе, основываясь на том, имеют ли они точку данных местоположения 4 или 5:
df2 <- df %>%
mutate(group=
if_else(Subj_ID ==1,
"Treatment",
if_else(Subj_ID == 2,
"Control","Withdrawn")))
df3 <- df2 %>% ##this chunk breaks filter(complete.cases(.))
group_by(Subj_ID) %>%
mutate(group2 = case_when(any(Location == 4) | any(Location == 5) ~ "YES", TRUE ~ "NO"))
complete.df <- df3 %>% filter(complete.cases(.))
Как только я сгенерирую df3, изменив df2, мой фильтр (complete.cases ( .)) впоследствии не получается.
Тем не менее, если бы я сгенерировал df3 путем ручного перекодирования, это работает! Как так:
df2 <- df %>%
mutate(group=
if_else(Subj_ID ==1,
"Treatment",
if_else(Subj_ID == 2,
"Control","Withdrawn")))
df3 <- df2 %>%
mutate(group2=
if_else(Subj_ID ==2 |
Subj_ID ==3,
"TRUE", "FALSE"))
complete.df <- df3 %>% filter(complete.cases(.))
Мысли?