dplyr:保留因子的空级别,但不保留不'的因子组合的空级别;不出现在数据中

dplyr:保留因子的空级别,但不保留不'的因子组合的空级别;不出现在数据中,r,dplyr,R,Dplyr,当使用dplyr进行分组和汇总时,保持每个分组因子的空级别而不保持多个分组因子的空组合的正确方法是什么 作为一个例子,考虑在多个站点在不同时间记录的数据。我可能会过滤,然后计算每个站点每年的数据。如果过滤器完全删除一年,我希望将摘要的默认值设置为空向量。所以站点“a”有10年,站点“b”有1年,所以我总是希望总结中有11行 如果我在groupby中使用.drop=TRUE,我会损失几年: 库(dplyr) 图书馆(动物园) 图书馆(lubridate) 种子(1) df 65)%>% 分组依据(

当使用
dplyr
进行分组和汇总时,保持每个分组因子的空级别而不保持多个分组因子的空组合的正确方法是什么

作为一个例子,考虑在多个站点在不同时间记录的数据。我可能会过滤,然后计算每个站点每年的数据。如果过滤器完全删除一年,我希望将摘要的默认值设置为空向量。所以站点“a”有10年,站点“b”有1年,所以我总是希望总结中有11行

如果我在
groupby
中使用
.drop=TRUE
,我会损失几年:

库(dplyr)
图书馆(动物园)
图书馆(lubridate)
种子(1)
df 65)%>%
分组依据(地点,年份,.drop=TRUE)%>%
总结(f=第一次(日期))
#>#tibble:6 x 3
#>#组:站点[1]
#>场地年份f
#>         
#>1A2000-04-01
#>2 a 2004-08-01
#>3 a 2005-01-01
#>4 a 2007-11-01
#>5 a 2008-10-01
#>6A 2009-02-01
通过
.drop=FALSE
我获得了站点“b”的所有额外年份,这些年份不在原始数据中:

df%>%
过滤器(值>65)%
分组依据(站点,年份,.drop=FALSE)%>%
总结(f=第一次(日期))
#>#tibble:20 x 3
#>#组:站点[2]
#>场地年份f
#>          
#>1A2000-04-01
#>2 a 2001 NA
#>3 a 2002年不适用
#>4 a 2003 NA
#>5A 2004-08-01
#>6A 2005-01-01
#>7 a 2006 NA
#>8A 2007-11-01
#>9 a 2008-10-01
#>10 a 2009-02-01
#>11 b 2000 NA
#>12 b 2001 NA
#>13 b 2002不适用
#>14 b 2003 NA
#>15 b 2004 NA
#>16 b 2005不适用
#>17 b 2006 NA
#>18 b 2007 NA
#>19 b 2008 NA
#>20 b 2009 NA
我能想到的最好的方法是计算计数,然后合并,然后过滤,然后删除计数变量,但这相当混乱。 我知道,
.drop
最近才添加到
dplyr
,这对于一个因素非常有用,但是对于多个因素,是否有一种干净的方法可以做到这一点

df%>%
过滤器(值>65)%
分组依据(站点,年份,.drop=FALSE)%>%
总结(f=第一次(日期))%>%
左联合(df%>%count(站点,年份,.drop=FALSE),by=c(“站点”,“年份”))%>%
过滤器(n>0)%>%
选择(-n)
#>#tibble:11 x 3
#>#组:站点[2]
#>场地年份f
#>          
#>1A2000-04-01
#>2 a 2001 NA
#>3 a 2002年不适用
#>4 a 2003 NA
#>5A 2004-08-01
#>6A 2005-01-01
#>7 a 2006 NA
#>8A 2007-11-01
#>9 a 2008-10-01
#>10 a 2009-02-01
#>11 b 2000 NA

不确定这是否是您喜欢的

如果您将日期替换为
value<65
而不是将其过滤掉,则可以照常进行



df %>% 
  mutate(date = replace(date, value < 65, NA)) %>%
  group_by(site, year) %>%
  summarise(f = first(date[!is.na(date)]))

# A tibble: 11 x 3
# Groups:   site [2]
   site  year  f         
   <fct> <fct> <date>    
 1 a     2000  NA        
 2 a     2001  NA        
 3 a     2002  2002-03-01
 4 a     2003  NA        
 5 a     2004  NA        
 6 a     2005  NA        
 7 a     2006  2006-02-01
 8 a     2007  NA        
 9 a     2008  2008-07-01
10 a     2009  2009-02-01
11 b     2000  2000-08-01


df%>%
突变(日期=替换(日期,值<65,NA))%>%
分组依据(地点,年份)%>%
总结(f=第一次(日期[!is.na(日期)])
#一个tibble:11x3
#组别:网站[2]
场地年份f
1 a 2000 NA
2 a 2001 NA
3A 2002-03-01
4 a 2003 NA
5 a 2004 NA
6 a 2005 NA
7A 2006-02-01
8 a 2007不适用
9 a 2008-07-01
10 a 2009-02-01
11 b 2000-08-01

为什么只保留
B2000
而不保留任何其他级别,如
B2001
?在原始数据中,只有站点
b
2000年
2000年的数据(
12行)谢谢,这样可以简化为
df%>%groupby(site,year)%>%summary(f=first(date[value>65])
。如果这可以在
dplyr
中完全完成,而不必使用
[/code>这在大数据上速度较慢。或者直接做
df%>%groupby(site,year)%%>%summary(fn=first(date[value>65]),