dplyr:按学校分组的因子的计数/百分比未分组

时间:2014-09-17 02:37:33

标签: r dplyr

我有一个很长的数据集,每个人有一行与学校分组。每行都有一个有序因子{1,2,3,4},"猫"。我希望得到每所学校中1,2,3,3和4的百分比。数据集如下所示:

  school_number           cats
1          10505             3
2          10505             3
3          10502             1
4          10502             1
5          10502             2
6          10502             1
7          10502             1
8          10502             2
10         10503             3
11         10505             2

我试过这样的事情:

df_pcts <- df %>%
   group_by(school_number) %>%
   mutate(total=sum(table(cats))) %>%
   summarize(cat_pct = table(cats)/total)

但是mutate()步骤产生的总变量会在每一行中显示总行数。我甚至无法进入最后的总结步骤。我很困惑。

P.S。在其他一些帖子中,我看到这样的行:

n = n()

当我这样做时,我收到一条消息说,

Error in n() : This function should not be called directly

这是从哪里来的?

TIA

3 个答案:

答案 0 :(得分:9)

也许这有点帮助,虽然我不能100%确定你需要什么输出。

使用tally计算df中存在的每个school_number / cats组合的行数。然后计算每个school_number中'cats'的百分比,然后只按school_number分组。

df %>%
  group_by(school_number,cats) %>%
  tally  %>%
  group_by(school_number) %>%
  mutate(pct=(100*n)/sum(n))

它给出了这个:

  #    school_number cats n       pct
  #  1         10502    1 4  66.66667
  #  2         10502    2 2  33.33333
  #  3         10503    3 1 100.00000
  #  4         10505    2 1  33.33333
  #  5         10505    3 2  66.66667

编辑:

要添加样本数据中缺少0%的行,您可以执行以下操作。将上面的输出与所有school_number / cats组合中包含0%的df绑定在一起。仅保留此绑定的第一个实例(如果存在,则第一个实例始终包含值&gt; 0%)。然后我通过school_number和猫安排它以便于阅读:

y<-df %>%
  group_by(school_number,cats) %>%
  tally  %>%
  group_by(school_number) %>%
  mutate(pct=(100*n)/sum(n)) %>%
  select(-n) 

x<-data.frame(school_number=rep(unique(df$school_number),each=4), cats=1:4,pct=0)  

rbind(y,x) %>%
  group_by(school_number,cats)%>%
  filter(row_number() == 1) %>%
  arrange(school_number,cats)

给出:

#   school_number cats       pct
#1          10502    1  66.66667
#2          10502    2  33.33333
#3          10502    3   0.00000
#4          10502    4   0.00000
#5          10503    1   0.00000
#6          10503    2   0.00000
#7          10503    3 100.00000
#8          10503    4   0.00000
#9          10505    1   0.00000
#10         10505    2  33.33333
#11         10505    3  66.66667
#12         10505    4   0.00000

答案 1 :(得分:0)

学校编号和猫的所有组合然后离开加入以计算pct。如果NA则为0

expand.grid(school_number =  unique(df$school_number), cats = levels(df$cats)) %>%
  left_join(df %>%
              group_by(school_number, cats) %>%
              tally %>%
              mutate(pct = (n / sum(n) * 100))) %>%
  select(-n) %>%
  mutate(pct = ifelse(is.na(pct), 0, pct)) %>%
  arrange(school_number)

给出了

   school_number cats       pct
1          10502    1  66.66667
2          10502    2  33.33333
3          10502    3   0.00000
4          10502    4   0.00000
5          10503    1   0.00000
6          10503    2   0.00000
7          10503    3 100.00000
8          10503    4   0.00000
9          10505    1   0.00000
10         10505    2  33.33333
11         10505    3  66.66667
12         10505    4   0.00000

答案 2 :(得分:0)

正如@akrun所建议的那样,您之前可能已经调用了self.ax.clear()plyr个包。由于两个包中都有dplyr个值,因此您可以通过在函数名称之前添加包来指定,即summaris(z)e