【问题标题】:adding new rows and values in R based on certain conditions根据特定条件在 R 中添加新行和值
【发布时间】:2021-09-24 18:37:57
【问题描述】:

我有一些按季度划分的时间序列数据,这些数据基于实际情况。

假设它看起来像这样。

df_actuals <- tibble(year=c(2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2020),
             quarter=c(1, 2, 3, 4, 1, 2, 3, 4, 1),
             value=c(10, 12, 10, 8, 9, 17, 11, 14, 15)
             )

然后我还有一些预测,即增长率,涵盖同一时期以及未来。

df_projections <- tibble(year=c(2018, 2019, 2020, 2021),
                      annual_growth=c(.026, .031, .017, .019))

我想要一个涵盖 2018-2021 年的数据框,它使用来自 df_actuals 的年份的实际值以及所有 4 个季度的值。对于只有部分或没有实际数据的任何年份,它改为应用来自 df_projections 的预计growth_rates 来计算预测的最后一年(目前是 2021 年,但最终将是 2022 年、2023 年等)的预计值。

理想情况下,最终结果应该是这样的。

year value
2018 10.00
2019 12.75
2020 12.97
2021 13.21

这样的事情是否可以通过简单的方式实现?

【问题讨论】:

  • 我认为预期的输出应该是正确的。 2020 年值应等于 2019 年值 * 1.017 2021 年值应等于 2020 年值 * 1.019
  • 抱歉,我忘了说这些值是按季度计算的,所以它们需要在一年中取平均值。 2018年价值=(10+12+10+8)/4=10 2019年价值=(9+17+11+14)/4=12.75

标签: r


【解决方案1】:

这里有一个解决方案。我已在您的示例数据中添加了 NA 以进行测试。

library(tibble) # Because you use tibble()
library(dplyr)  # One option for calculating annual sums

df_actuals <- tibble(year=c(2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2020),
             quarter=c(1, 2, 3, 4, 1, 2, 3, 4, 1),
             value=c(10, 12, 10, 8, 9, 17, 11, NA, 15)
             )

df_actuals

df_projections <- tibble(year=c(2018, 2019, 2020, 2021),
                      annual_growth=c(.026, .031, .017, .019))

df_projections

# First sum value for each year
ann_act <- summarise(group_by(df_actuals, year), value = sum(value))

# Alternative without add-on packages
ann_act <- aggregate(df_actuals$value, list(year = df_actuals$year), sum)
names(ann_act)[2] <- 'value'

# Merge in growth rates
ann_comb <- merge(ann_act, df_projections)

# Sort to be sure earliest year is first
ann_comb <- ann_comb[order(ann_comb$year), ]

# Project value, finding previous year for each row 
# This is meant to work if some years are missing -- if that is not needed, simpler solution is possible
ann_comb$value_proj <- c(NA, ((1 + ann_comb$annual_growth) * ann_comb$value)[match(ann_comb$year[-1] - 1, ann_comb$year)])

# Select returned value based on whether actual value is available
ann_comb$value_returned <- ifelse(is.na(ann_comb$value), ann_comb$value_proj, ann_comb$value)

ann_comb

结果:

> ann_comb
  year value annual_growth value_proj value_returned
1 2018    40         0.026         NA          40.00
2 2019    NA         0.031      41.04          41.04
3 2020    15         0.017         NA          15.00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2020-09-13
    • 2020-03-12
    • 1970-01-01
    • 2023-01-23
    相关资源
    最近更新 更多