Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr摘要中的等效计数_R_Dplyr - Fatal编程技术网

dplyr摘要中的等效计数

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)和每组学生人数(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

如何使摘要中的长度函数像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)