【发布时间】: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<-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