r - 按两行一组汇总

标签 r dplyr tidyverse

我有一个数据框,我想将其按两个变量分组,然后汇总总数和平均值。

我在我的数据上尝试了这个,这是正确的。

df %>%
  group_by(date, group) %>%
  summarise(
    weight = sum(ind_weigh) ,
    total_usage = sum(total_usage_min) ,
    Avg_usage = total_usage / weight) %>% 
  ungroup()

它返回此数据框:

df <- tibble::tribble(
     ~date, ~group,   ~weight, ~total_usage, ~Avg_usage,
  20190201,      0,  450762,     67184943,        149,
  20190201,      1, 2788303,    385115718,        138,
  20190202,      0,  483959,     60677765,        125,
  20190202,      1, 2413699,    311226351,        129,
  20190203,      0,  471189,     59921762,        127,
  20190203,      1, 2143811,    277425186,        129,
  20190204,      0,  531020,     83695977,        158,
  20190204,      1, 2640087,    403200829,        153
  )

我想知道如何在脚本中添加另一个变量来获取 avg_usage_total(对于组 0 和组 1)。

预期结果:

例如,第一行 --> (67184943/(450762 + 2788303) = 20.7

date    group   rech    total_usage Avg_usage   Avg_usage_total
20190201    0   450762  67184943    149             20.7
20190201    1   2788303 385115718   138             118.9

最佳答案

如有必要,您可以使用 mutategroup_by 来实现这一点。

library(tidyverse)

# generate dataset
(df <- tibble(
  date = c(rep(Sys.Date(), 10), rep(Sys.Date() - 1, 10)),
  group = rbinom(20, 1, 0.5),
  rech = runif(20),
  weight = runif(20),
  total_usage = runif(20)
))
# A tibble: 20 x 5
   date       group   rech weight total_usage
   <date>     <int>  <dbl>  <dbl>       <dbl>
 1 2019-03-10     0 0.985  0.831      0.963  
 2 2019-03-10     1 0.178  0.990      0.676  
 3 2019-03-10     1 0.505  0.697      0.152  
 4 2019-03-10     1 0.416  0.165      0.824  
 5 2019-03-10     0 0.554  0.790      0.974  

# step 1 of analysis
(df <- df %>%
  group_by(date, group) %>%
  summarise(rech = sum(rech),
            weight = sum(weight),
            total_usage = sum(total_usage)) %>%
  mutate(Avg_usage = total_usage / weight))
# A tibble: 4 x 6
# Groups:   date [2]
  date       group  rech weight total_usage Avg_usage
  <date>     <int> <dbl>  <dbl>       <dbl>     <dbl>
1 2019-03-09     0  3.29   4.82        3.03     0.628
2 2019-03-09     1  1.45   1.22        1.16     0.954
3 2019-03-10     0  1.54   1.62        1.94     1.20 
4 2019-03-10     1  3.15   4.55        4.63     1.02 

# step 2 of analysis
df %>%
  group_by(date) %>% # only necessary if you want to compute Avg_usage_total by date
  mutate(Avg_usage_total = total_usage / sum(rech)) %>% # total_usage is taken by row, sum is taken for the entire column
  ungroup()
# A tibble: 4 x 7
  date       group  rech weight total_usage Avg_usage Avg_usage_total
  <date>     <int> <dbl>  <dbl>       <dbl>     <dbl>           <dbl>
1 2019-03-09     0  3.29   4.82        3.03     0.628           0.639
2 2019-03-09     1  1.45   1.22        1.16     0.954           0.246
3 2019-03-10     0  1.54   1.62        1.94     1.20            0.413
4 2019-03-10     1  3.15   4.55        4.63     1.02            0.986

关于r - 按两行一组汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55088032/

相关文章:

r - 在 R 中按类型对数据进行排序

r - 将 Excel 文件名与 dplyr::bind_rows .id 关联

r - 识别一组计数中的索引号

r - 计算与列值匹配的第一行和 n 行之间的持续时间/差异

r - 在单个 mutate() 语句中组合多个 cross(),同时控制 R 中的变量名称

r - 在 r-bloggers 上获取 hugo-goa 的 blogdown

返回 data.table 中某一列中的列表

r - 计算与其他列的双重类别关联的列中的特定字符。根据频率仓迭代进行

r - 通过仅更改 mutate() 中的一个自变量来拟合多个回归模型

r - R中的特殊 reshape