Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:求和直到达到0,然后重新启动_R_Loops_Dataframe_If Statement_Cumsum - Fatal编程技术网

R:求和直到达到0,然后重新启动

R:求和直到达到0,然后重新启动,r,loops,dataframe,if-statement,cumsum,R,Loops,Dataframe,If Statement,Cumsum,在这篇帖子上已经发表的言论或评论的基础上: 我有一个类似的数据帧,它有大约50k+的观测值。此数据帧是从csv文件读取的,是已对其执行的若干操作的结果。在此处粘贴示例: Home Date Time Appliance Run value 679 2 1/21/2017 1:30:00 0 1 0 680 2 1/21/2017 1:45:00 0 1

在这篇帖子上已经发表的言论或评论的基础上:

我有一个类似的数据帧,它有大约50k+的观测值。此数据帧是从csv文件读取的,是已对其执行的若干操作的结果。在此处粘贴示例:

          Home      Date     Time   Appliance Run   value
    679      2  1/21/2017  1:30:00          0   1       0
    680      2  1/21/2017  1:45:00          0   1       0
    681      2  1/21/2017  2:00:00          0   1       0
    682      2  1/21/2017  2:15:00          0   1       0
    683      2  1/21/2017  2:30:00        804   0       1
    684      2  1/21/2017  2:45:00        556   0     804
    685      2  1/21/2017  3:00:00        844   0    1360
    686      2  1/21/2017  3:15:00        396   0    2204
    687      2  1/21/2017  3:30:00        392   0    2600
    688      2  1/21/2017  3:45:00       1220   0    2992
    689      2  1/21/2017  4:00:00          0   1       0
    690      2  1/21/2017  4:15:00          0   1       0
    691      2  1/21/2017  4:30:00          0   1       0
    692      2  1/21/2017  4:45:00          0   1       0
    783      2  1/22/2017  3:30:00          0   1       0
    784      2  1/22/2017  3:45:00        244   0    4212
    785      2  1/22/2017  4:00:00       1068   0    4456
    786      2  1/22/2017  4:15:00         44   0    5524
    787      2  1/22/2017  4:30:00       1240   0    5568
    788      2  1/22/2017  4:45:00         40   0    6808
    789      2  1/22/2017  5:00:00       1608   0    6848
    790      2  1/22/2017  5:15:00          0   1       0
    791      2  1/22/2017  5:30:00          0   1       0
我使用的代码,作为答案之一,df=transformdf,value=aveapplication,Run,FUN=functionxc1,headcumsumx,-1

但是,正如您在输出中所看到的,在下一次出现0时,总和不会重新开始,加上第一组683-688索引的最后一次总和将结转至784索引号。请帮助我在下次出现0时重新开始求和

预期产出:

附言:我也试过了:

这里有一个data.table选项。分组变量不应运行,而应运行rleidRun

资料

这里有一个data.table选项。分组变量不应运行,而应运行rleidRun

资料


基于什么求和?基于什么求和?有帮助!先使用setDT,然后使用setDF。谢谢。投票表决。还有一件事,我们可以用类似的方法来计算百分比份额而不是求和吗?试试dt[,share:=0];dt[,share:=Appliance/sumpiance,by=rleidRun]太棒了!非常感谢@markus。现在,剩下的是将这些组按月份划分为单独的数据帧。有没有简单的方法?还是我应该四处看看?因为今天是圣尼古拉斯节。将日期列转换为类日期,然后使用split:dt[,Date:=as.datedatedate,%m/%d/%Y];splitdt,dt[,monthDate]。您将得到一个data.tables列表。如果您需要在全球环境中使用list2env,请使用它。帮助!先使用setDT,然后使用setDF。谢谢。投票表决。还有一件事,我们可以用类似的方法来计算百分比份额而不是求和吗?试试dt[,share:=0];dt[,share:=Appliance/sumpiance,by=rleidRun]太棒了!非常感谢@markus。现在,剩下的是将这些组按月份划分为单独的数据帧。有没有简单的方法?还是我应该四处看看?因为今天是圣尼古拉斯节。将日期列转换为类日期,然后使用split:dt[,Date:=as.datedatedate,%m/%d/%Y];splitdt,dt[,monthDate]。您将得到一个data.tables列表。如果您需要在您的全局环境中使用list2env。
          Home       Date     Time  Appliance Run   value
    679      2  1/21/2017  1:30:00          0   1       0
    680      2  1/21/2017  1:45:00          0   1       0
    681      2  1/21/2017  2:00:00          0   1       0
    682      2  1/21/2017  2:15:00          0   1       0
    683      2  1/21/2017  2:30:00        804   0     804
    684      2  1/21/2017  2:45:00        556   0    1360
    685      2  1/21/2017  3:00:00        844   0    2204
    686      2  1/21/2017  3:15:00        396   0    2600
    687      2  1/21/2017  3:30:00        392   0    2992
    688      2  1/21/2017  3:45:00       1220   0    4212
    689      2  1/21/2017  4:00:00          0   1       0
    690      2  1/21/2017  4:15:00          0   1       0
    691      2  1/21/2017  4:30:00          0   1       0
    692      2  1/21/2017  4:45:00          0   1       0
    783      2  1/22/2017  3:30:00          0   1       0
    784      2  1/22/2017  3:45:00        244   0     244
    785      2  1/22/2017  4:00:00       1068   0    1312
    786      2  1/22/2017  4:15:00         44   0    1356
    787      2  1/22/2017  4:30:00       1240   0    2596
    788      2  1/22/2017  4:45:00         40   0    2636
    789      2  1/22/2017  5:00:00       1608   0    4244
    790      2  1/22/2017  5:15:00          0   1       0
    791      2  1/22/2017  5:30:00          0   1       0
library(data.table)
dt <- fread(text)
dt[, value := cumsum(Appliance), by = rleid(Run)]
dt
#     V1 Home      Date    Time Appliance Run value
# 1: 679    2 1/21/2017 1:30:00         0   1     0
# 2: 680    2 1/21/2017 1:45:00         0   1     0
# 3: 681    2 1/21/2017 2:00:00         0   1     0
# 4: 682    2 1/21/2017 2:15:00         0   1     0
# 5: 683    2 1/21/2017 2:30:00       804   0   804
# 6: 684    2 1/21/2017 2:45:00       556   0  1360
# 7: 685    2 1/21/2017 3:00:00       844   0  2204
# 8: 686    2 1/21/2017 3:15:00       396   0  2600
# 9: 687    2 1/21/2017 3:30:00       392   0  2992
#10: 688    2 1/21/2017 3:45:00      1220   0  4212
#11: 689    2 1/21/2017 4:00:00         0   1     0
#12: 690    2 1/21/2017 4:15:00         0   1     0
#13: 691    2 1/21/2017 4:30:00         0   1     0
#14: 692    2 1/21/2017 4:45:00         0   1     0
#15: 783    2 1/22/2017 3:30:00         0   1     0
#16: 784    2 1/22/2017 3:45:00       244   0   244
#17: 785    2 1/22/2017 4:00:00      1068   0  1312
#18: 786    2 1/22/2017 4:15:00        44   0  1356
#19: 787    2 1/22/2017 4:30:00      1240   0  2596
#20: 788    2 1/22/2017 4:45:00        40   0  2636
#21: 789    2 1/22/2017 5:00:00      1608   0  4244
#22: 790    2 1/22/2017 5:15:00         0   1     0
#23: 791    2 1/22/2017 5:30:00         0   1     0
#24: 792    2 1/22/2017 5:45:00         0   1     0
#25: 793    2 1/22/2017 6:00:00         0   1     0
#26: 794    2 1/22/2017 6:15:00         0   1     0
#27: 795    2 1/22/2017 6:30:00         0   1     0
#28: 796    2 1/22/2017 6:45:00         0   1     0
#29: 797    2 1/22/2017 7:00:00         0   1     0
#30: 798    2 1/22/2017 7:15:00         0   1     0
df1 <- read.table(text = text, stringsAsFactors = FALSE, header = TRUE)

rle_Run <- rle(df1$Run)
df1$value <- with(df1, ave(Appliance, rep(seq_along(rle_Run$lengths), rle_Run$lengths), FUN = cumsum))
text <- "          Home      Date     Time   Appliance Run   value
    679      2  1/21/2017  1:30:00          0   1       0
680      2  1/21/2017  1:45:00          0   1       0
681      2  1/21/2017  2:00:00          0   1       0
682      2  1/21/2017  2:15:00          0   1       0
683      2  1/21/2017  2:30:00        804   0       1
684      2  1/21/2017  2:45:00        556   0     804
685      2  1/21/2017  3:00:00        844   0    1360
686      2  1/21/2017  3:15:00        396   0    2204
687      2  1/21/2017  3:30:00        392   0    2600
688      2  1/21/2017  3:45:00       1220   0    2992
689      2  1/21/2017  4:00:00          0   1       0
690      2  1/21/2017  4:15:00          0   1       0
691      2  1/21/2017  4:30:00          0   1       0
692      2  1/21/2017  4:45:00          0   1       0
783      2  1/22/2017  3:30:00          0   1       0
784      2  1/22/2017  3:45:00        244   0    4212
785      2  1/22/2017  4:00:00       1068   0    4456
786      2  1/22/2017  4:15:00         44   0    5524
787      2  1/22/2017  4:30:00       1240   0    5568
788      2  1/22/2017  4:45:00         40   0    6808
789      2  1/22/2017  5:00:00       1608   0    6848
790      2  1/22/2017  5:15:00          0   1       0
791      2  1/22/2017  5:30:00          0   1       0
792      2  1/22/2017  5:45:00          0   1       0
793      2  1/22/2017  6:00:00          0   1       0
794      2  1/22/2017  6:15:00          0   1       0
795      2  1/22/2017  6:30:00          0   1       0
796      2  1/22/2017  6:45:00          0   1       0
797      2  1/22/2017  7:00:00          0   1       0
798      2  1/22/2017  7:15:00          0   1       0"