根据时间变量计算每个观察的不同列的总和
Calculating the sum of different columns for every observation based on a time variable
假设以下时间序列数据集:
DF <- data.frame(T0=c(2012, 2016, 2014),
T1=c(2017, NA, 2019),
Duration= c(5,3,5),
val12 =c(15,43,7),
val13 =c(16,44,8),
val14 =c(17,45,9),
val15 =c(18,46,10),
val16 =c(19,47,11),
val17 =c(20,48,12),
val18 =c(21,49,13),
val19 =c(22,50,14),
SumVal =c(105,194,69))
print(DF)
T0 T1 Duration val12 val13 val14 val15 val16 val17 val18 val19 SumVal
1 2012 2017 5 15 16 17 18 19 20 21 22 105
2 2016 NA 3 43 44 45 46 47 48 49 50 194
3 2014 2019 5 7 8 9 10 11 12 13 14 69
为了构建持续时间模型,我想根据持续时间将 "valXX" 变量聚合到一个 SumVal 变量中,就像上面的 table 一样。第一个 SumVal (105) 对应于 val12+...+val17,因为这是第一次观察的给定时间间隔 (2012-2017)。
T1 中的 NA 表示感兴趣的事件尚未发生,观察结果已删失。在这种情况下,持续时间和 SumVal 将基于间隔 T0:2019。
我很难在 R 中实现一个可以在非常大的数据帧上执行此任务的函数。
如有任何帮助,我们将不胜感激!
这是一个 tidyverse 方法。
library(tidyverse)
DF %>%
# Track orig rows, and fill in NA T1's
mutate(row = row_number(),
T1 = if_else(is.na(T1), T0 + Duration, T1)) %>%
# Gather into long form
gather(col, value, val12:val19) %>%
# convert column names into years
mutate(year = col %>% str_remove("val") %>% as.numeric + 2000) %>%
# Only keep the rows within each duration
filter(year >= T0 & year <= T1) %>%
# Count total value by row, equiv to
# group_by(row) %>% summarize(SumVal2 = sum(value))
count(row, wt = value, name = "SumVal2")
# A tibble: 3 x 2
row SumVal2
<int> <dbl>
1 1 105
2 2 194
3 3 69
假设以下时间序列数据集:
DF <- data.frame(T0=c(2012, 2016, 2014),
T1=c(2017, NA, 2019),
Duration= c(5,3,5),
val12 =c(15,43,7),
val13 =c(16,44,8),
val14 =c(17,45,9),
val15 =c(18,46,10),
val16 =c(19,47,11),
val17 =c(20,48,12),
val18 =c(21,49,13),
val19 =c(22,50,14),
SumVal =c(105,194,69))
print(DF)
T0 T1 Duration val12 val13 val14 val15 val16 val17 val18 val19 SumVal
1 2012 2017 5 15 16 17 18 19 20 21 22 105
2 2016 NA 3 43 44 45 46 47 48 49 50 194
3 2014 2019 5 7 8 9 10 11 12 13 14 69
为了构建持续时间模型,我想根据持续时间将 "valXX" 变量聚合到一个 SumVal 变量中,就像上面的 table 一样。第一个 SumVal (105) 对应于 val12+...+val17,因为这是第一次观察的给定时间间隔 (2012-2017)。
T1 中的 NA 表示感兴趣的事件尚未发生,观察结果已删失。在这种情况下,持续时间和 SumVal 将基于间隔 T0:2019。
我很难在 R 中实现一个可以在非常大的数据帧上执行此任务的函数。
如有任何帮助,我们将不胜感激!
这是一个 tidyverse 方法。
library(tidyverse)
DF %>%
# Track orig rows, and fill in NA T1's
mutate(row = row_number(),
T1 = if_else(is.na(T1), T0 + Duration, T1)) %>%
# Gather into long form
gather(col, value, val12:val19) %>%
# convert column names into years
mutate(year = col %>% str_remove("val") %>% as.numeric + 2000) %>%
# Only keep the rows within each duration
filter(year >= T0 & year <= T1) %>%
# Count total value by row, equiv to
# group_by(row) %>% summarize(SumVal2 = sum(value))
count(row, wt = value, name = "SumVal2")
# A tibble: 3 x 2
row SumVal2
<int> <dbl>
1 1 105
2 2 194
3 3 69