【问题标题】:Summarise values in one column based on grouping and index根据分组和索引汇总一列中的值
【发布时间】:2020-06-19 10:03:24
【问题描述】:

我想根据索引和分组来总结一个值。 这是我的玩具数据集:

vals<- 1:5 
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(rslt <- dfx %>% 
  mutate(dts = as.Date(dts)) %>%
  arrange(dts) %>%
  group_by(grps) %>%
  mutate(dist = as.numeric(last(dts) - dts)))

生成的 df 如下所示:

   vals  grps dts         dist
  <dbl> <dbl> <date>     <dbl>
1     1     1 2020-01-01     1
2     2     1 2020-01-02     0
3     3     2 2020-01-03     2
4     4     2 2020-01-04     1
5     5     2 2020-01-05     0

我想为每一行获取一个新变量(例如通过 mutate()),它是每个组 (grps) 中所有日期的摘要行小于或等于索引中给定的值 (dist)。 换句话说,我想在某个截止日期之前获取每个每日间隔的值 (vals) 的摘要,同时合并分组。

所以我想要的最终结果将是我的 df (sum) 中的一列:

# A tibble: 5 x 5
# Groups:   grps [2]
   vals  grps dts         dist   sum
  <dbl> <dbl> <date>     <dbl> <dbl>
1     1     1 2020-01-01     1     3
2     2     1 2020-01-02     0     2
3     3     2 2020-01-03     2    12
4     4     2 2020-01-04     1     9
5     5     2 2020-01-05     0     5

【问题讨论】:

    标签: r time sum row tidyverse


    【解决方案1】:

    您可以通过dist 获取arrange 数据,并为每个grps 获取cumsum。

    library(dplyr)
    
    rslt %>%
      arrange(grps, dist) %>%
      group_by(grps) %>%
      mutate(sum = cumsum(vals))
    
    #   vals  grps dts         dist   sum
    #  <dbl> <dbl> <date>     <dbl> <dbl>
    #1     2     1 2020-01-02     0     2
    #2     1     1 2020-01-01     1     3
    #3     5     2 2020-01-05     0     5
    #4     4     2 2020-01-04     1     9
    #5     3     2 2020-01-03     2    12
    

    【讨论】:

      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多