每组dplyr百分比

时间:2017-08-02 17:31:39

标签: r group-by dplyr percentage

如何计算dplyr中每列另一列的数据帧百分比?

df包含以下记录

 A  target
   a    1
   b    0
   a    0
   a    1

这完成了第一部分

df %>%
  group_by(A) %>%
  summarise (n = n())

这是第二次

df %>%
  group_by(A, target) %>%
  summarise (n = n(), target_sum = sum(target))%>%
  filter(target == 1) %>%
  mutate(freq = n / target_sum)

但商是取自

在python / pandas中

grouped = df_original.groupby(['A', 'target']).size()
df = (grouped / grouped.groupby(level=0).sum())
grouped = df.reset_index(name='percentageA')
groupedOnly = grouped[grouped.target == 1]

将通过以下结果实现所需的计算:

a   1   0.666667

3 个答案:

答案 0 :(得分:4)

你觉得太复杂了。尝试

df %>%
  group_by(A) %>%
  summarise (mean(target))

# A tibble: 2 x 2
#       A `mean(target)`
#       <fctr>          <dbl>
#    1      a      0.6666667
#    2      b      0.0000000

答案 1 :(得分:2)

我们可以在table

中将prop.tableR一起使用
prop.table(table(df), 1)[,2]
#    a         b 
#0.6666667 0.0000000 

答案 2 :(得分:0)

这是您了解数据流动方式的一种方式,但我喜欢Alex的效率解决方案。

df <- tribble(
  ~A , ~target,
  "a" ,   1,
  "b" ,   0,
  "a" ,   0,
  "a" ,   1
 )


df %>%
   group_by(A) %>%
   mutate(n = n()) %>%
   group_by(A,target,n) %>%
   mutate(n_target = n()) %>%
   mutate(freq = n_target / n) %>%
   filter(target==1) %>%
   ungroup() %>%
   distinct(A,target,freq)