如果我整理了数据:
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(。))将从该组中删除一行,那么取而代之的是删除整个组?
答案 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