【问题标题】:Merging dataframe every x row每 x 行合并数据框
【发布时间】:2016-12-28 04:50:46
【问题描述】:

我正在尝试按每 n 行合并数据框中的值。 数据结构如下:

id  value
1   1
2   2
3   1
4   2
5   3
6   4
7   1
8   2
9   4
10  4
11  2
12  1

我喜欢汇总每 4 行的值。实际上,数据集描述了每 4 天的测量值。

id"1" = day1,
id"2" = day2,
id"3" = 第 3 天,
id"4" = 第 4 天,
id"5" = 第 1 天,
...

因此,可以使用从 1 到 4 的循环中的列计数吗?

结果应该看起来像(总和):

day sum
1   8
2   10
3   4
4   5

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    这可以通过%% 来创建分组变量,然后使用sumaggregate 来实现

    n <- 4
    aggregate(value ~cbind(day = (seq_along(df1$id)-1) %% n + 1), df1, FUN = sum)
    #   day value
    #1   1     8
    #2   2    10
    #3   3     4
    #4   4     5
    

    这种方法也可以与dplyr/data.table一起使用

    library(dplyr)
    df1 %>%
         group_by(day = (seq_along(id)-1) %% 4 +1) %>%
          summarise(value = sum(value))
    #     day value
    #  <dbl> <int>
    #1     1     8
    #2     2    10
    #3     3     4
    #4     4     5
    

    setDT(df1)[, .(value = sum(value)), .(day = (seq_along(id) - 1) %% 4 + 1)]
    #   day value
    #1:   1     8
    #2:   2    10
    #3:   3     4
    #4:   4     5
    

    【讨论】:

    • 看起来不错,但我想知道为什么sum(colSums(matrix(df1$value, nrow=4)))的结果返回另一个值?
    • @JohnnyDeer 因为matrix(df1$value, nrow =4) 正在创建具有第一个 4 值的列,然后是下一个 4 值,等等。所以你需要rowSumsrowSums(matrix(df1$value, nrow=4))# [1] 8 10 4 5 但是,此方法 当列的长度是 4 的倍数时效果很好。
    【解决方案2】:

    您需要创建一个序列来分组,例如

    rep(1:4, length = nrow(df))
    ## [1] 1 2 3 4 1 2 3 4 1 2 3 4
    

    aggregate:

    aggregate(value ~ cbind(day = rep(1:4, length = nrow(df))), df, FUN = sum)
    
    ##   day value
    ## 1   1     8
    ## 2   2    10
    ## 3   3     4
    ## 4   4     5
    

    或 dplyr:

    library(dplyr)
    
    df %>% group_by(day = rep(1:4, length = n())) %>% summarise(sum = sum(value))
    
    ## # A tibble: 4 x 2
    ##     day   sum
    ##   <int> <int>
    ## 1     1     8
    ## 2     2    10
    ## 3     3     4
    ## 4     4     5
    

    或data.table:

    library(data.table)
    
    setDT(df)[, .(sum = sum(value)), by = .(day = rep(1:4, length = nrow(df)))]
    
    ##    day sum
    ## 1:   1   8
    ## 2:   2  10
    ## 3:   3   4
    ## 4:   4   5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-07
      • 2013-12-09
      • 2019-12-04
      • 2016-07-14
      • 2022-01-20
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多