【问题标题】:Aggregating data at different levels within a dataframe in R在 R 中的数据框中聚合不同级别的数据
【发布时间】:2018-07-25 20:39:30
【问题描述】:

我正在处理数据存储在较低级别的数据框。每一行是一个案例,每一列是一个结果。我想在不丢失原始信息的情况下将这些数据聚合到两个更高的级别。数据如下所示:

set.seed(301)
df <- data.frame(
  level1 = c(1:20),
  level2 = c(1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6, 6, 7, 8, 9, 9, 10, 11),
  level3 = c(rep(1, 8), rep(2, 6), rep(3, 4), rep(4, 2)),
  a = round(runif(20, 10000, 20000)),
  b = round(runif(20, 0, 100)),
  c = round(runif(20, 0, 1000)),
  d = round(runif(20, 50000, 90000))
)

这会产生以下内容:

   level1 level2 level3     a  b   c     d
1       1      1      1 15971 98 183 64768
2       2      1      1 11322 72 355 75087
3       3      2      1 10021 82 638 86030
4       4      2      1 17540 37 557 73085
5       5      3      1 16141 45 809 66978
6       6      3      1 14337 56 228 75227
7       7      3      1 16648 31 468 74257
8       8      3      1 19809 53 108 68250
9       9      4      2 14344 20  44 68319
10     10      5      2 18439 47 200 77471
11     11      5      2 17576 65 672 71247
12     12      5      2 16972 12 148 89347
13     13      6      2 14986 47  54 70600
14     14      6      2 14492 22 903 71335
15     15      7      3 10702 70 818 70757
16     16      8      3 16815 70 182 71346
17     17      9      3 14595 39 722 62427
18     18      9      3 14407 47 323 80146
19     19     10      4 17453 68 144 72299
20     20     11      4 17332 64 559 53931

我正在寻找一种方法来创建八个新列,将 a - d(位于第 1 级)聚合到第 2 级和第 3 级。因此,完成的数据框将有 8 个新列,总共 15 列。四个将 a - d 汇总到第 2 级,而四个将 a - d 汇总到第 3 级。

我知道这会在许多行中产生冗余(尤其是在第 3 级),但这不是问题。

【问题讨论】:

    标签: r dataframe aggregate


    【解决方案1】:

    带data.table:

    library(data.table)
    setDT(df)
    df[, a_level2 := sum(a), by = level2]
    

    有基础R

    agg <- aggregate(a ~ level2, data=df, FUN=sum)
    names(agg)[2] <- "a_level2"
    df <- merge(df, agg, by="level2")
    

    使用 Tidyverse/dplyr

    library(dplyr)
    df <- df %>% 
        group_by(level2) %>% 
        summarise(a_level2 = sum(a)) %>% 
        right_join(df, by="level2")
    

    【讨论】:

      【解决方案2】:
      library(dplyr)
      df %>%
        group_by(level2) %>%
        mutate(a_lvl2 = sum(a), 
               b_lvl2 = sum(b), 
               c_lvl2 = sum(c), 
               d_lvl2 = sum(d)) %>%
        group_by(level3) %>%
        mutate(a_lvl3 = sum(a), 
               b_lvl3 = sum(b), 
               c_lvl3 = sum(c), 
               d_lvl3 = sum(d))
      

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 2020-07-10
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2016-01-13
        相关资源
        最近更新 更多