簡體   English   中英

在 R 中生成基於時間序列的條件

[英]Generating a time-series based condition in R

考慮一個包含 3 列的數據框:A - 名稱; B——一年的食物攝入量(一個名字可以吃不同的食物); C - 該人停止食用該食物的年份

如:

AB 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))

如果你真的想要一個時間序列,每一行都有一列,最后一行有總計,那么試試這個:

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)))) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM