dplyr摘要中的等效计数
我有一个数据框,列出参加活动的学生总数(Stu)和每组学生人数(ID): 我想知道大小级别(>400、>200、>100、>0)中参与活动(Sub>0)或不参与活动(Sub is.na)的群体数量 但我得到:dplyr摘要中的等效计数,r,dplyr,R,Dplyr,我有一个数据框,列出参加活动的学生总数(Stu)和每组学生人数(ID): 我想知道大小级别(>400、>200、>100、>0)中参与活动(Sub>0)或不参与活动(Sub is.na)的群体数量 但我得到: Stu entries noentries (dbl) (int) (int) 1 0 2 2 2 100 3 3 3 200 1 1 如何使摘要中的长度函数像co
Stu entries noentries
(dbl) (int) (int)
1 0 2 2
2 100 3 3
3 200 1 1
如何使摘要中的长度函数像countif一样工作?
summary
需要一个值,因此sum
而不是length
执行以下操作:
output %>%
mutate(Stu = ifelse(Stu >= 400, 400,
ifelse(Stu >= 200, 200,
ifelse(Stu >= 100, 100, 0
)))) %>%
group_by(Stu) %>%
summarise(entries = sum(!is.na(Sub)),
noentries = sum(is.na(Sub)))
Source: local data frame [3 x 3]
Stu entries noentries
(dbl) (int) (int)
1 0 0 2
2 100 0 3
3 200 1 0
另一种选择是按
Stu
和Sub
进行分组,但要做到这一点,我们需要首先重新编码Sub
和Stu
的值,以匹配我们想要的输出分组。我们还使用cut
,而不是嵌套的ifelse
,来设置Stu
中的值分隔符:
library(reshape2)
output %>%
group_by(Sub=ifelse(is.na(Sub), "No Entries", "Entries"),
Stu=cut(Stu, c(0,100,200,400,Inf), labels=c(0,100,200,400))) %>%
tally %>%
dcast(Stu ~ Sub, fill=0)
遵循@eipi10提供的相同想法,但用
count()
而不是groupby()%%>%tally()
切入主题,并表明tidyr::spread
可以模仿重塑2::dcast
:
output %>%
count(Sub = ifelse(is.na(Sub), 'No Entries', 'Entires'),
Stu = cut(Stu, c(0, 100, 200, 400, +Inf), labels = c(0, 100, 200, 400))) %>%
tidyr::spread(Sub, n, fill = 0)
在您上次的ifelsesorry中,某事物出错,漏掉了0,它现在应该可以工作了
sum
是正确的解决方案,如下所述。为了清楚起见,length返回所提供向量的长度。在这种情况下,不管真/假值如何,length函数都返回每组中的项数。啊,是的,我忘记了这一点。na返回一个布尔向量,可以求和
output %>%
mutate(Stu = ifelse(Stu >= 400, 400,
ifelse(Stu >= 200, 200,
ifelse(Stu >= 100, 100, 0
)))) %>%
group_by(Stu) %>%
summarise(entries = sum(!is.na(Sub)),
noentries = sum(is.na(Sub)))
Source: local data frame [3 x 3]
Stu entries noentries
(dbl) (int) (int)
1 0 0 2
2 100 0 3
3 200 1 0
library(reshape2)
output %>%
group_by(Sub=ifelse(is.na(Sub), "No Entries", "Entries"),
Stu=cut(Stu, c(0,100,200,400,Inf), labels=c(0,100,200,400))) %>%
tally %>%
dcast(Stu ~ Sub, fill=0)
Stu Entries No Entries
1 0 0 2
2 100 0 3
3 200 1 0
output %>%
count(Sub = ifelse(is.na(Sub), 'No Entries', 'Entires'),
Stu = cut(Stu, c(0, 100, 200, 400, +Inf), labels = c(0, 100, 200, 400))) %>%
tidyr::spread(Sub, n, fill = 0)