在 R 中生成基于时间序列的条件

Generating a time-series based condition in R

考虑一个包含 3 列的数据框:A - 名称; B——一年的食物摄入量(一个名字可以吃不同的食物); C - 该人停止食用该食物的年份

如:

A​​ B C
彼得 400 2035
彼得 500 2050
彼得 350 2024
约翰 700 2050

我需要创建一个时间序列,对每个人从今天 (2022) 到 2050 年的所有食物摄入量求和。对于约翰来说很简单:700 * (2050-2022)。但是对于 Peter,我需要添加一些限制:将 3 条线相加直到 2024 年,然后其中一条变为零,但时间序列不断对其他两条线求和,直到最终只有一条线可以求和。

所以 2022 年将是 (400+500+350),2023 年到 2024 年也是如此。然后是 (400+500),直到 2035 年,等等。

这让我可以得到一个时间序列,每个人,其中包含每年的食物摄入量,同时考虑到每年的食物摄入量会逐年减少。

你在计算期间的总摄入量吗?然后这将计算它:

library(tidyverse)

data <- tribble(~"A", ~"B", ~"C",
                "Peter", 400, 2035,
                "Peter", 500, 2050,
                "Peter", 350, 2024,
                "John", 700, 2050)    

data %>% 
  mutate(line_total = B*(C - 2022)) %>% # 2022 being the start year
  group_by(A) %>% 
  summarise(person_total = sum(line_total))

如果您真的想要一个 time-series,每一行都有一列,最后是该行的总数,那么试试这个:

years <- 2022:max(data$C)

mat <- matrix(nrow = nrow(data), ncol = length(years)) 
colnames(mat) <- c(years)

timeseries <- cbind(data, mat) %>% 
  as_tibble() %>% 
  pivot_longer(-c(A, B, C)) %>% 
  mutate(value = ifelse(name <= C, B, 0)) %>% 
  pivot_wider() %>% 
  select(-c(B, C)) %>% 
  mutate(rowsum = rowSums(across(where(is.numeric))))