[英]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.