如何防止R删除大小为0的组

如何防止R删除大小为0的组,r,R,我运行以下代码来计算站点超过90天的天数 temp2 <- temp %>% filter(ds > '2017-12-31') %>% filter(over90 == 1) %>% group_by(site) %>% tally() 发生了什么: site n a 2 我想要的是: site n a 2 b 0 一种选择是使用表。但您必须首先在因子中转换站点,以便在调用表函数后包括所有因子的计数 l

我运行以下代码来计算站点超过90天的天数

temp2 <- temp %>%
    filter(ds > '2017-12-31') %>%
    filter(over90 == 1) %>%
    group_by(site) %>%
    tally()
发生了什么:

site n
a    2
我想要的是:

site n
a    2
b    0

一种选择是使用
。但您必须首先在
因子
中转换
站点
,以便在调用
函数后包括所有因子的计数

library(dplyr)

df %>% mutate(site = as.factor(site)) %>%   #This line is very important. 
  filter(over90 ==1) %>%                               
  group_by(site) %>%
  table()

# site 1
# a    2
# b    0
数据:

df <- read.table(text = 
"site over90
a    1
a    0
a    1
b    0",
header = TRUE, stringsAsFactors = FALSE)

df如果您的
站点
是一个因子变量,您可以使用
tidyr::complete
来填充末尾的空白:

filter(dd, over90 == 1) %>% 
  group_by(site) %>% 
  tally() %>% 
  complete(site, fill = list(n = 0))
# A tibble: 2 x 2
    site     n
  <fctr> <dbl>
1      a     2
2      b     0
过滤器(dd,90以上==1)%>%
分组依据(站点)%>%
计数()%>%
完成(现场,填写=列表(n=0))
#一个tibble:2x2
站点n
1 a 2
2B0

资料


dd
tally
没有达到您想要的效果。由于您只想计算
over_90
等于1且该变量为二进制的行数,因此可以对该列求和以获得计数效果

df = data_frame(site=sample(letters[1:3], 10, replace=TRUE),
                over_90=sample(0:1, 10, replace=TRUE))
df
# A tibble: 10 x 2
#    site over_90
#   <chr>   <int>
# 1     c       0
# 2     b       1
# 3     c       0
# 4     b       0
# 5     c       1
# 6     b       0
# 7     a       0
# 8     a       1
# 9     c       1
#10     c       0

df$over_90[df$site == 'c'] = 0
df %>% group_by(site) %>% summarise(n = sum(over_90))
# A tibble: 3 x 2
#   site     n
#  <chr> <dbl>
#1     a     1
#2     b     1
#3     c     0
df=data\u frame(site=sample(字母[1:3],10,replace=TRUE),
超过90=样本(0:1,10,替换=真实))
df
#一个tibble:10x2
#场地面积超过90
#      
#1C0
#2 b 1
#3C0
#4B0
#5 c 1
#6B0
#7 a 0
#8 a 1
#9 c 1
#10c0
df$90以上[df$site=='c']=0
df%>%分组(站点)%>%总结(n=总和(超过90))
#一个tibble:3x2
#站点n
#   
#1 a 1
#2 b 1
#3C0

请展示一个可重复的小示例和预期输出为什么不删除过滤器()而将变量添加到group_by()语句中?例如,group_by(90岁以上,站点)。添加了一个示例为什么不直接执行
df@CoreyLevinson这很可能是OP简化了问题,因此添加一行是不可行的。在他们的真实代码中,他们可能有30个不同的
site
值,但
值超过90
的值不等于1,这是您不希望手动添加的。我很感激
tidyr::complete
能够完成这项工作。但我只是想知道,如果
站点
是一个因素(相反,我们可以将其更改为
因素
),那么即使是
函数也可以是一个替代方案。我的理解正确吗?是的,你的回答很好地说明了这一点<代码>表格
很好,因为它内置于base中,简化了工作流程
table
不太好,因为它返回的是一个
table
对象,而不是一个数据帧(如果有更多的列,它将是一个多维数组)。根据我刚才运行的基准测试,使用
table
执行的时间大约要长10倍。以毫秒为单位的平均时间:
{gregor:37.9,brittenb:38.4,mkr:366.7}
@brittenb我直接使用
可以获得更快的时间。我认为在数据帧上使用它会减慢速度,但是如果你只使用(table(site,over90))
filter(dd,over90==1)%>%和(table(site,over90))
它比其他方法快10倍多。如果我的站点不是一个因子变量呢?这是一个智能选项,但对性能没有把握。您可以根据OP中的样本数据更新您的答案。
dd <- read.table(text = 
"site over90
a    1
a    0
a    1
b    0",
header = TRUE)
df = data_frame(site=sample(letters[1:3], 10, replace=TRUE),
                over_90=sample(0:1, 10, replace=TRUE))
df
# A tibble: 10 x 2
#    site over_90
#   <chr>   <int>
# 1     c       0
# 2     b       1
# 3     c       0
# 4     b       0
# 5     c       1
# 6     b       0
# 7     a       0
# 8     a       1
# 9     c       1
#10     c       0

df$over_90[df$site == 'c'] = 0
df %>% group_by(site) %>% summarise(n = sum(over_90))
# A tibble: 3 x 2
#   site     n
#  <chr> <dbl>
#1     a     1
#2     b     1
#3     c     0