我建议的第一件事是将填写缺失数据的任务与重新格式化数据的任务分开。您已经在 for 循环中组合了这两个任务,但我认为通过这种分离可以简化和加速代码。
为了演示,我将使用我自己的简化示例代码和数据,这与您的类似。以下演示使用一个小时的时间点,从 2012-01-01 09:00 到 2012-01-01 09:59。我已经生成了前 20 分钟的完整数据,并模拟了剩余 40 分钟的缺失数据:
timeFirst20Min <- seq(as.POSIXct('2012-01-01 09:00'),as.POSIXct('2012-01-01 09:19'),60);
timeNextScattered10 <- sort(sample(seq(as.POSIXct('2012-01-01 09:20'),as.POSIXct('2012-01-01 09:59'),60),10));
timeRaw <- c(timeFirst20Min,timeNextScattered10);
raw <- data.frame(airtemp=rnorm(30), humidity=rnorm(30), power=rnorm(30), time=timeRaw );
timeFull <- seq(as.POSIXct('2012-01-01 09:00'),as.POSIXct('2012-01-01 09:59'),60);
clean <- merge(raw, data.frame(time=timeFull), all=T );
clean;
这会产生以下输出:
time airtemp humidity power
1 2012-01-01 09:00:00 -1.84406568 -1.51751811 -0.09391613
2 2012-01-01 09:01:00 -0.58830616 -0.02222524 -0.07865711
3 2012-01-01 09:02:00 1.63189916 -1.35274437 -1.32762005
4 2012-01-01 09:03:00 -1.96424678 0.07326323 -0.29004060
5 2012-01-01 09:04:00 -0.60856223 1.15876062 0.29804843
6 2012-01-01 09:05:00 -0.11504175 -0.43092259 0.49660688
7 2012-01-01 09:06:00 0.24671752 0.58974028 -1.08949827
8 2012-01-01 09:07:00 0.88375964 0.35821875 -0.94881659
9 2012-01-01 09:08:00 -0.70284907 -2.39016066 0.03804497
10 2012-01-01 09:09:00 1.34738493 0.64676077 0.77714355
11 2012-01-01 09:10:00 0.32271920 1.83127669 -1.44754595
12 2012-01-01 09:11:00 -0.46106830 -1.82204149 1.28886422
13 2012-01-01 09:12:00 2.27484699 -1.29816051 0.67963614
14 2012-01-01 09:13:00 -0.25799515 -0.23864259 0.33414247
15 2012-01-01 09:14:00 0.27535436 1.15491712 1.25857697
16 2012-01-01 09:15:00 0.09447671 0.72562227 0.35426141
17 2012-01-01 09:16:00 2.46141564 0.10448464 -0.04715810
18 2012-01-01 09:17:00 0.32952643 -0.51843045 -0.44380916
19 2012-01-01 09:18:00 0.34571678 1.74200137 2.05858658
20 2012-01-01 09:19:00 0.62863598 -0.38642998 1.29170691
21 2012-01-01 09:20:00 NA NA NA
22 2012-01-01 09:21:00 NA NA NA
23 2012-01-01 09:22:00 0.83148733 -0.79160256 -0.98798400
24 2012-01-01 09:23:00 NA NA NA
25 2012-01-01 09:24:00 NA NA NA
26 2012-01-01 09:25:00 NA NA NA
27 2012-01-01 09:26:00 -0.80548958 0.99318673 0.49630420
28 2012-01-01 09:27:00 NA NA NA
29 2012-01-01 09:28:00 -1.12821534 -0.64763280 0.28033445
30 2012-01-01 09:29:00 NA NA NA
31 2012-01-01 09:30:00 1.77407448 0.21064525 0.97942804
32 2012-01-01 09:31:00 NA NA NA
33 2012-01-01 09:32:00 -0.71832822 0.89608884 -0.14460970
34 2012-01-01 09:33:00 NA NA NA
35 2012-01-01 09:34:00 NA NA NA
36 2012-01-01 09:35:00 NA NA NA
37 2012-01-01 09:36:00 NA NA NA
38 2012-01-01 09:37:00 NA NA NA
39 2012-01-01 09:38:00 NA NA NA
40 2012-01-01 09:39:00 -0.17353680 1.69963228 0.10863195
41 2012-01-01 09:40:00 1.03484529 1.69734966 3.00898820
42 2012-01-01 09:41:00 NA NA NA
43 2012-01-01 09:42:00 NA NA NA
44 2012-01-01 09:43:00 -1.13983790 1.51982921 0.58583242
45 2012-01-01 09:44:00 NA NA NA
46 2012-01-01 09:45:00 NA NA NA
47 2012-01-01 09:46:00 NA NA NA
48 2012-01-01 09:47:00 NA NA NA
49 2012-01-01 09:48:00 NA NA NA
50 2012-01-01 09:49:00 NA NA NA
51 2012-01-01 09:50:00 NA NA NA
52 2012-01-01 09:51:00 NA NA NA
53 2012-01-01 09:52:00 -0.93153818 0.77736403 2.08962697
54 2012-01-01 09:53:00 NA NA NA
55 2012-01-01 09:54:00 2.26031675 -0.49847630 -1.48191078
56 2012-01-01 09:55:00 NA NA NA
57 2012-01-01 09:56:00 NA NA NA
58 2012-01-01 09:57:00 NA NA NA
59 2012-01-01 09:58:00 NA NA NA
60 2012-01-01 09:59:00 NA NA NA
所以第一个任务是在clean 上插入缺失的幂值。现在,在您的代码中,您似乎正在向后看整整 24 小时,以获取在基准时间点之前恰好存在的功率值(如果存在;它不能保证存在,是吗?) ,并将其复制到向量的末尾,该向量表示在窗口期间进行的功率测量。这是我指的代码:
Statlag2=Total_Zone1$time[tt]-24*60*60
Index_lags2=which(Total_Zone1$time==Statlag2)
tem1=rep(Total_Zone1[Index_lags2,c("Power")],Window-size(Index_lags)[2])
lag_Power[tt,]=t(c(Total_Zone1[Index_lags,c("Power")],tem1))
我不确定您为什么要向后看 24 小时,尤其是考虑到窗口只有 15 分钟并且仅在基准时间点前 10 分钟结束。我也不确定为什么您将插值值(充分复制以弥补可用功率值的不足)添加到存储在lag_Power 上的行的 end 上;不应该是开始吗,特别是考虑到插值来自窗口之前这么长时间?我可能在这里遗漏了重要的背景;如果我遗漏了什么,请发表评论。
无论如何,我要做的就是及时从最近的可用值中填充缺失的功率值。我发现了一个出色的最近插值函数,它可以直接处理来自Replacing NAs in R with nearest value 的单个向量。在这里,我自己重新格式化:
interpolateMissing <- function(dat) {
N <- length(dat);
missing <- which(is.na(dat));
if (length(missing) %in% c(0,N)) return(dat);
notMissing <- which(!is.na(dat));
intervals <- findInterval(missing, notMissing, all.inside=T );
leftPos <- notMissing[pmax(1,intervals)];
rightPos <- notMissing[pmin(N,intervals+1)];
leftDist <- missing - leftPos;
rightDist <- rightPos - missing;
dat[missing] <- ifelse(leftDist <= rightDist, dat[leftPos], dat[rightPos] );
return(dat);
};
您可以使用它轻松地从最接近的可用值插入所有缺失的功率值:
clean$power <- interpolateMissing(clean$power);
clean 现在看起来像这样:
time airtemp humidity power
1 2012-01-01 09:00:00 -1.84406568 -1.51751811 -0.09391613
2 2012-01-01 09:01:00 -0.58830616 -0.02222524 -0.07865711
3 2012-01-01 09:02:00 1.63189916 -1.35274437 -1.32762005
4 2012-01-01 09:03:00 -1.96424678 0.07326323 -0.29004060
5 2012-01-01 09:04:00 -0.60856223 1.15876062 0.29804843
6 2012-01-01 09:05:00 -0.11504175 -0.43092259 0.49660688
7 2012-01-01 09:06:00 0.24671752 0.58974028 -1.08949827
8 2012-01-01 09:07:00 0.88375964 0.35821875 -0.94881659
9 2012-01-01 09:08:00 -0.70284907 -2.39016066 0.03804497
10 2012-01-01 09:09:00 1.34738493 0.64676077 0.77714355
11 2012-01-01 09:10:00 0.32271920 1.83127669 -1.44754595
12 2012-01-01 09:11:00 -0.46106830 -1.82204149 1.28886422
13 2012-01-01 09:12:00 2.27484699 -1.29816051 0.67963614
14 2012-01-01 09:13:00 -0.25799515 -0.23864259 0.33414247
15 2012-01-01 09:14:00 0.27535436 1.15491712 1.25857697
16 2012-01-01 09:15:00 0.09447671 0.72562227 0.35426141
17 2012-01-01 09:16:00 2.46141564 0.10448464 -0.04715810
18 2012-01-01 09:17:00 0.32952643 -0.51843045 -0.44380916
19 2012-01-01 09:18:00 0.34571678 1.74200137 2.05858658
20 2012-01-01 09:19:00 0.62863598 -0.38642998 1.29170691
21 2012-01-01 09:20:00 NA NA 1.29170691
22 2012-01-01 09:21:00 NA NA -0.98798400
23 2012-01-01 09:22:00 0.83148733 -0.79160256 -0.98798400
24 2012-01-01 09:23:00 NA NA -0.98798400
25 2012-01-01 09:24:00 NA NA -0.98798400
26 2012-01-01 09:25:00 NA NA 0.49630420
27 2012-01-01 09:26:00 -0.80548958 0.99318673 0.49630420
28 2012-01-01 09:27:00 NA NA 0.49630420
29 2012-01-01 09:28:00 -1.12821534 -0.64763280 0.28033445
30 2012-01-01 09:29:00 NA NA 0.28033445
31 2012-01-01 09:30:00 1.77407448 0.21064525 0.97942804
32 2012-01-01 09:31:00 NA NA 0.97942804
33 2012-01-01 09:32:00 -0.71832822 0.89608884 -0.14460970
34 2012-01-01 09:33:00 NA NA -0.14460970
35 2012-01-01 09:34:00 NA NA -0.14460970
36 2012-01-01 09:35:00 NA NA -0.14460970
37 2012-01-01 09:36:00 NA NA 0.10863195
38 2012-01-01 09:37:00 NA NA 0.10863195
39 2012-01-01 09:38:00 NA NA 0.10863195
40 2012-01-01 09:39:00 -0.17353680 1.69963228 0.10863195
41 2012-01-01 09:40:00 1.03484529 1.69734966 3.00898820
42 2012-01-01 09:41:00 NA NA 3.00898820
43 2012-01-01 09:42:00 NA NA 0.58583242
44 2012-01-01 09:43:00 -1.13983790 1.51982921 0.58583242
45 2012-01-01 09:44:00 NA NA 0.58583242
46 2012-01-01 09:45:00 NA NA 0.58583242
47 2012-01-01 09:46:00 NA NA 0.58583242
48 2012-01-01 09:47:00 NA NA 0.58583242
49 2012-01-01 09:48:00 NA NA 2.08962697
50 2012-01-01 09:49:00 NA NA 2.08962697
51 2012-01-01 09:50:00 NA NA 2.08962697
52 2012-01-01 09:51:00 NA NA 2.08962697
53 2012-01-01 09:52:00 -0.93153818 0.77736403 2.08962697
54 2012-01-01 09:53:00 NA NA 2.08962697
55 2012-01-01 09:54:00 2.26031675 -0.49847630 -1.48191078
56 2012-01-01 09:55:00 NA NA -1.48191078
57 2012-01-01 09:56:00 NA NA -1.48191078
58 2012-01-01 09:57:00 NA NA -1.48191078
59 2012-01-01 09:58:00 NA NA -1.48191078
60 2012-01-01 09:59:00 NA NA -1.48191078
所以,现在可以使用了,无需担心缺失值。
最后一点是,我不确定构造lag_Power 矩阵有什么好处。每个窗口与其他窗口有很大重叠,因此该矩阵将包含大量重复数据。相反,我会看看这些数据是如何在这个预备代码的下游使用的,看看是否可以更改它以直接在clean(或您的代码Total_Zone1)中访问特定于窗口的值。这可以节省处理时间和内存影响。