【问题标题】:complete.cases for group instead of observation?组而不是观察的完整案例?
【发布时间】:2016-05-27 22:48:17
【问题描述】:

如果我整理过数据:

df = expand.grid(Name=c("Sub1","Sub2","Sub3"),Vis=c("Yes","No")) %>%
       mutate(KPR_mean=c(NA,1,3,2,3,2),KPR_range=c(NA,4,4,2,6,5)) %>%
       filter(complete.cases(.))

我想过滤掉不完整的因子组合,留下一个完整的因子模型。现在,我这样做如下:

df %>% 
  unite(KPR_mean_range,KPR_mean,KPR_range) %>%
  spread(Vis,KPR_mean_range) %>%
  filter(complete.cases(.)) %>%
  gather(Win,KPR_mean_range,-Name) %>%
  separate(KPR_mean_range,c("KPR_mean","KPR_range"),sep="_")

但这似乎真的很冗长,一旦有多个因素和更多变量,也很难扩展。有没有办法过滤分组变量而不是行?即,对于每个名称级别,如果 filter(complete.cases(.)) 将从该组中删除一行,然后删除整个组?

【问题讨论】:

  • 您能否以可重复的方式共享您的数据(例如,与dput())?阅读您发布到 R 中的示例数据以及其中的列类是一件很痛苦的事情。
  • 我猜即使这对你不起作用,因为unite 步骤将NA 连接为NA_NAcomplete.cases() 不适用于字符NA_NA
  • 我可能会计算出每个主题的预期行数,并过滤掉行数少于此数的组。类似n_expected = length(unique(df$Vis)); group_by(df, Name) %>% filter(n() == n_expected)
  • @Gregor:哎呀,我从来没有意识到你必须这样做。我用相同形式的一些虚构数据替换了它。
  • 更改数据会更改代码的结果。

标签: r dplyr tidyr


【解决方案1】:

对于新数据,将您的答案扩展到所有案例,按您希望完成案例的变量分组,并用NAs 过滤掉组:

df %>% complete(Vis, Name) %>% group_by(Name) %>% filter(!any(is.na(KPR_mean)))
# Source: local data frame [4 x 4]
# Groups: Name [2]
# 
#      Vis   Name KPR_mean KPR_range
#   (fctr) (fctr)    (dbl)     (dbl)
# 1    Yes   Sub2        1         4
# 2    Yes   Sub3        3         4
# 3     No   Sub2        3         6
# 4     No   Sub3        2         5

【讨论】:

    【解决方案2】:

    这是data.table 的一个选项。我们将“data.frame”转换为“data.table”,指定关键列(setDT(df,..),如果“KPP_range”中没有“NA”值,则按“名称”分组,子集行组。

    library(data.table)
    setDT(df, key = c("Name", "Vis"))[CJ(Name, Vis, unique=TRUE)][,
                 if(all(!is.na(KPR_mean))) .SD , Name]
    #   Name Vis KPR_mean KPR_range
    #1: Sub2 Yes        1         4
    #2: Sub2  No        3         6
    #3: Sub3 Yes        3         4
    #4: Sub3  No        2         5
    

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2019-03-15
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多