如何防止R删除大小为0的组
我运行以下代码来计算站点超过90天的天数如何防止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
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
资料
ddtally
没有达到您想要的效果。由于您只想计算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