Ошибка «Результат должен иметь длину ...» с «complete.cases» - PullRequest
2 голосов
/ 05 января 2020

Это расширение вопроса, который я задал здесь , где я искал способ автоматизировать маркировку предметов в группы на основе того, соответствуют ли их данные моему фильтру.

До попытки автоматизировать маркировку, это то, что я имел.

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(.))

Мысли?

1 Ответ

2 голосов
/ 05 января 2020

Это будет атрибут group_by, который вызывает проблему и может быть решен с помощью ungroup ing, а затем применяется filter. В последнем кодовом блоке OP (ручное кодирование) он не создает атрибут группировки, и поэтому он работает

library(dplyr)
df3 %>%
       ungroup %>%
       filter(complete.cases(.))

Или вместо complete.cases в filter мы можем использовать !is.na с filter_all без удаления атрибута группировки

df3 %>% 
    filter_all(any_vars(!is.na(.)))

OP, упомянутый о последнем блоке кода, работает, но не имеет никакого атрибута группы. Если мы создадим его, он тоже не сможет работать

df3 %>% 
     group_by(group) %>%
     filter(complete.cases(.))

Ошибка: результат должен иметь длину 3, а не 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...