【问题标题】:sum values from preceding rows based on condition R根据条件 R 对前几行的值求和
【发布时间】:2023-01-26 01:20:02
【问题描述】:

我正在尝试创建一个新列“sum_heat_on_prev_periods”,它将 a 的前几行的值相加不同的仅当条件基于第三满足不同的列。

为了说明 - 我在数据框 hh02 中有时间序列数据。每行是 30 分钟的时间段。每天最后一次关闭热量时 heat_final_off_algo3 == 1。我想创建一个新列,返回热量的总和在最终关闭之前。我只想回顾 8 小时的总和,所以 16 行(每行 30 分钟)。加热的每个周期由 heat_on_prev == 1 指示。如果 heat_final_off_algo3==0,这是大多数行的情况,则不必进行求和,新列“sum_heat_on_prev_periods”将返回 NA。

我的数据集是 20K+ 行,但下面是一个包含必要列的示例:

hh02 <- data.frame(row=c(1,2,3,4,5,6,7,8,9,10),
                 heat_final_off_algo3 = c(0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0),
                 avg_roomtemp = c(20,19,19,17,16,15,14,13,12,11,10,9,8,7,6,5),
                 temp_prev=c(21,20,19,19,17,16,15,14,13,12,11,10,9,8,7,6),
                 heat_on_prev = c(1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0))

#heat_final_off_algo3 is a binary column with either 1 or 0 values indicating yes (1) algo is true or (0) algo is false 
  
#avg_roomtemp is average room temperature

#temp_prev is the room temperature from the previous row - created using lag(avg_roomtemp,1) 

#heat_on_prev is a binary column with either 1 or 0 values indicating yes (1) the heat was on in the previous period or no (0) heat was not on in the previous period 

我想创建一个新列“sum_heat_on_prev_periods”添加前一个“heat_on_prev”值16行-但这仅适用于 heat_final_off_algo3 == 1 的情况,否则 (heat_final_off_algo3==0),我希望“sum_heat_on_prev”列返回“NA”

本质上,“sum_heat_on_prev_periods”将是前 16 个加热时段中 30 分钟时段的总计数

结果/输出看起来像这样:

row heat_final_off_algo3 avg_roomtemp temp_prev heat_on_prev sum_heat_on_prev_periods
1 0 20 21 1 NA
2 0 19 20 1 NA
3 1 19 19 1 3
4 0 17 19 0 NA
5 0 16 17 0 NA
6 0 15 16 0 NA
7 0 14 15 0 NA
8 0 13 14 1 NA
9 0 12 13 0 NA
10 1 11 12 0 4
11 0 10 11 0 NA
12 0 9 10 0 NA
13 0 8 9 1 NA
14 0 7 8 0 NA
15 0 6 7 0 NA
16 0 5 6 0 NA

为此,我尝试编写函数

fxn <- function(x) { 
  if (heat_final_off_algo3==1){
    sum_heat_on_prev_periods <- (heat_on_prev) + (lag(heat_on_prev,1)) + (lag(heat_on_prev,2)) + (lag(heat_on_prev,3)) + (lag(heat_on_prev,4)) + (lag(heat_on_prev,5)) + (lag(heat_on_prev,6)) + (lag(heat_on_prev,7)) + (lag(heat_on_prev,8)) + (lag(heat_on_prev,9)) + (lag(heat_on_prev,10)) + (lag(heat_on_prev,11)) + (lag(heat_on_prev,12)) + (lag(heat_on_prev,13)) + (lag(heat_on_prev,14)) + (lag(heat_on_prev,15)) + (lag(heat_on_prev,16))
  }
} 

并尝试使用它来应用它

hh02$sum_heat_on_prev_periods <- plyr::ddply(hh02, c("heat_final_off_algo3", "heat_on_prev"), fxn)

我已经尝试了这个的几种变体 - 甚至使用 mutate_if 和 case_when,但上面的代码/方法是我得到的最接近代码运行的方法。但是,它仍然不起作用并返回错误“.fun(piece, ...) 中的错误:未找到对象 'heat_final_off_algo3'” - 可能是代码中的错位错误,而不是对象中的错误

预先感谢您对此的任何帮助!

【问题讨论】:

  • 您的数据只有 16 行。例如,如果将条件从 16 更改为 10 会发生什么情况?结果会怎样?
  • 您的示例 data.frame 已损坏:arguments imply differing number of rows: 10, 16,我建议将其替换为 hh02&lt;-structure(list(row=1:16,heat_final_off_algo3=c(0L,0L,1L,0L,0L,0L,0L,0L,0L,1L,0L,0L,0L,0L,0L,0L),avg_roomtemp=c(20L,19L,19L,17L,16L,15L,14L,13L,12L,11L,10L,9L,8L,7L,6L,5L),temp_prev=c(21L,20L,19L,19L,17L,16L,15L,14L,13L,12L,11L,10L,9L,8L,7L,6L),heat_on_prev=c(1L,1L,1L,0L,0L,0L,0L,1L,0L,0L,0L,0L,1L,0L,0L,0L)),class="data.frame",row.names=c(NA,-16L))(取自格式化表格)

标签: r function if-statement dplyr transform


【解决方案1】:

假设“句点”是一行,我们可以使用 zoo::rollapply 来实现:

hh02 %>%
  mutate(
    newcol = if_else(
      heat_final_off_algo3 > 0,
      zoo::rollapplyr(heat_on_prev, 16, partial = TRUE, FUN = sum, na.rm = TRUE), 
      heat_on_prev[NA])
  )
#    row heat_final_off_algo3 avg_roomtemp temp_prev heat_on_prev sum_heat_on_prev_periods newcol
# 1    1                    0           20        21            1                       NA     NA
# 2    2                    0           19        20            1                       NA     NA
# 3    3                    1           19        19            1                        3      3
# 4    4                    0           17        19            0                       NA     NA
# 5    5                    0           16        17            0                       NA     NA
# 6    6                    0           15        16            0                       NA     NA
# 7    7                    0           14        15            0                       NA     NA
# 8    8                    0           13        14            1                       NA     NA
# 9    9                    0           12        13            0                       NA     NA
# 10  10                    1           11        12            0                        4      4
# 11  11                    0           10        11            0                       NA     NA
# 12  12                    0            9        10            0                       NA     NA
# 13  13                    0            8         9            1                       NA     NA
# 14  14                    0            7         8            0                       NA     NA
# 15  15                    0            6         7            0                       NA     NA
# 16  16                    0            5         6            0                       NA     NA

heat_on_prev[NA] 的使用是确保我们根据数据返回正确的 NA 类的一种方法。它在这里是整数,所以我们可以使用NA_integer_,但我更愿意保证类即使它(甚至不小心)转移到numeric

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 2017-11-26
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多