complete.cases 组而不是观察?

complete.cases for group instead of observation?

如果我整理过数据:

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(.)) 会从该组中删除一行,那么会删除整个组吗?

对于新数据,将您的答案扩展到所有案例,按您希望完成的案例所在的变量进行分组,并使用 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

这是 data.table 的一个选项。我们将 'data.frame' 转换为 'data.table' 并指定键列 (setDT(df,..),如果没有 'NA' 值,则进行交叉连接,按 'Name' 分组在 'KPP_range' 中,对行组进行子集化。

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