首页 > 解决方案 > 数学运算对每个类别的两列进行分组总和

问题描述

我尝试根据来自两个不同列的值按组计算百分比。

我使用 dplyr 对数据进行分组,然后进行数学运算。我输入命令是错误的,因为所有组的结果都相同,我想我的代码只显示一个总百分比,而不是按组显示。

> x <- data.frame("code"=c("a","a","b","b","a","b"),"home" = c(1,1,1,1,1,1),
+                 "trap" = c(0,1,0,1,0,1))
> x
  code home trap
1    a    1    0
2    a    1    1
3    b    1    0
4    b    1    1
5    a    1    0
6    b    1    1
> x %>% 
+   group_by(code) %>% 
+   mutate(perc=(sum(trap)/sum(home)))
# A tibble: 6 x 4
# Groups:   code [2]
  code   home  trap  perc
  <fct> <dbl> <dbl> <dbl>
1 a         1     0   0.5
2 a         1     1   0.5
3 b         1     0   0.5
4 b         1     1   0.5
5 a         1     0   0.5
6 b         1     1   0.5
> 

这个想法是获得关于家庭的陷阱的权重(在同一组的所有行中应该是相同的)

我想得到这个数据框:

  code   home  trap  perc
  <fct> <dbl> <dbl> <dbl>
1 a         1     0   0.333
2 a         1     1   0.333
3 b         1     0   0.666
4 b         1     1   0.666
5 a         1     0   0.333
6 b         1     1   0.666
> 

标签: rgrouping

解决方案


我们只需要mean

x %>%
   group_by(code) %>% 
   dplyr::mutate(perc = mean(trap))
# A tibble: 6 x 4
# Groups:   code [2]
#  code   home  trap  perc
#  <fct> <dbl> <dbl> <dbl>
#1 a         1     0 0.333
#2 a         1     1 0.333
#3 b         1     0 0.667
#4 b         1     1 0.667
#5 a         1     0 0.333
#6 b         1     1 0.667

不同的值可能是由于summarise被掩蔽plyr::summarise而不是dplyr::summarise(当两个包都加载到全局环境中时)。要解决此问题,请指定dplyr::或启动仅dplyr加载的新会话

x %>% 
    group_by(code) %>%
    dplyr::mutate(perc = sum(trap)/sum(home))

推荐阅读