【问题标题】:"Result must have length..." error with 'complete.cases'“结果必须有长度......”'complete.cases'的错误
【发布时间】:2020-01-06 04:52:17
【问题描述】:

这是我向here 提出的问题的扩展,我正在寻找一种方法,根据他们的数据是否与我的过滤器匹配,自动将我的主题标记为组。

在尝试自动标记之前,这就是我所拥有的。

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

一旦我通过变异 df2 生成 df3,我的 filter(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(.))

想法?

【问题讨论】:

    标签: r


    【解决方案1】:

    可能是group_by 属性导致问题,可以通过ungrouping 解决,然后应用filter。在 OP 的最后一个代码块(手动编码)中,它没有创建分组属性,因此它可以工作

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

    或者代替filter中的complete.cases,我们可以在不删除分组属性的情况下使用!is.nafilter_all

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

    关于最后一个代码块的 OP 正在工作,但它没有任何组属性。如果我们创建一个,那么它也会失败

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

    错误:结果的长度必须是 3,而不是 9

    【讨论】:

    • 我花了大约 5 个小时来解决这个问题,你在我发帖后的 5 分钟内回答正确。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多