complete.cases for group而不是观察?

时间:2016-05-27 22:48:17

标签: r dplyr tidyr

如果我整理了数据:

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="_")

但这看起来真的很冗长,而且一旦有多个因素和更多变数,也很难扩展。有没有办法过滤分组变量,而不是一行?即,对于每个Name级别,如果filter(complete.cases(。))将从该组中删除一行,那么取而代之的是删除整个组?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

以下是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