2

使用 R 脚本我从数据库中读取值。这些值包含以下数据框。

>values #return the output as follows

ID           Date      Hour      Value
1          2013-06-01    8           9
2          2013-06-01    9          17
3          2013-06-01   10          16
4          2013-06-01   11          21
5          2013-06-01   12          19
6          2013-06-01   13          15
7          2013-06-01   14          14
8          2013-06-01   15          14
9          2013-06-01   16          21
10         2013-06-01   17          22
11         2013-06-01   18          13
12         2013-06-01   19           2
13         2013-06-01   20           2
14         2013-06-01   21           1
15         2013-06-01   22           1
16         2013-06-01   23           1
17         2013-06-02    0           0
18         2013-06-02    1           0
19         2013-06-02    2           0
20         2013-06-02    3           1
21         2013-06-02    4           0
22         2013-06-02    5           0
23         2013-06-02    6           1
24         2013-06-02    7           1
25         2013-06-02    8          20
26         2013-06-02    9          21
27         2013-06-02   10          21
28         2013-06-02   11          15
29         2013-06-02   12          12
30         2013-06-02   13          11
31         2013-06-02   14          10
32         2013-06-02   15          16
33         2013-06-02   16          21
34         2013-06-02   17          22
35         2013-06-02   18          18
36         2013-06-02   19           9
37         2013-06-02   20           2
38         2013-06-02   21           0
39         2013-06-02   23           0

我想找出数据框中缺失的小时数,并在该日期的缺失小时内将 0 添加到值中。
示例:
根据上述数据框,日期 2013-06-02 缺少 22 小时。我想在 21 和 23 小时之间插入一行

ID           Date      Hour      Value
39         2013-06-02    22         0

我怎样才能做到这一点?

我尝试如下:

我有一个小时清单

>hours<-c(0:23)
> hours #return as follows
 [1]  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

>i<-values$Hour[1]+1
>count<-nrow(values)
>for(j in 1:count){
+h<-values$Hour[j]
+hr<-hours[i]
+if(h != hr)
+{
+#write code to insert row
+}
+i<-i+1
+if(i==25)
+{
+i<-c(1)
+}
+}

请帮我...

4

2 回答 2

5

这是一种使用方法data.table

require(data.table) 
# install the package and then load if you don't have it already
dt <- data.table(values, key="Hour")
out <- merge(dt[, .SD[J(Hour[1]:23), roll=-Inf], by=Date, 
      .SDcols = c("Hour", "ID")], dt[, list(Date, Hour, Value)], 
      by=c("Date", "Hour"), all=TRUE)[is.na(Value), Value := 0L]

说明:您的问题有点不同/复杂,因为 1)您似乎只想在缺失值发生在中间而不是其他任何地方(开始或结束)时才填写缺失值,以及 2)您想ID用最后一个非缺失值的相同值ID(可以用 a 完成roll),但您想用 0 填充Value对应于缺失ID的值(不能用 a 完成roll)。

因此,这个想法是首先ID通过 using获取缺失值roll=-Inf。这是通过以下语句完成的:

dt[, .SD[J(Hour[1]:23), roll=-Inf], by=Date, .SDcols = c("Hour", "ID")]

这是在将密钥设置为 之后Hour

现在,我们需要NAValue新添加的ID. 因此,我们merge将其返回dtID删除,因为我们已经处理过它)。这是通过以下方式完成的:

dt[, list(Date, Hour, Value)]

一旦我们有了这些,我们merge在列上Date, Hour并使用参数all=TRUE来填充缺失值。最后,我们将任何NAfor替换为Value0。

于 2013-08-20T11:44:40.873 回答
4

对于每个日期,将行设为 0:23,转换为数据框,然后与您的数据合并。

您的数据:

values <- read.table(text="ID           Date      Hour      Value
1          2013-06-01    8           9
2          2013-06-01    9          17
3          2013-06-01   10          16
4          2013-06-01   11          21
5          2013-06-01   12          19
6          2013-06-01   13          15
7          2013-06-01   14          14
8          2013-06-01   15          14
9          2013-06-01   16          21
10         2013-06-01   17          22
11         2013-06-01   18          13
12         2013-06-01   19           2
13         2013-06-01   20           2
14         2013-06-01   21           1
15         2013-06-01   22           1
16         2013-06-01   23           1
17         2013-06-02    0           0
18         2013-06-02    1           0
19         2013-06-02    2           0
20         2013-06-02    3           1
21         2013-06-02    4           0
22         2013-06-02    5           0
23         2013-06-02    6           1
24         2013-06-02    7           1
25         2013-06-02    8          20
26         2013-06-02    9          21
27         2013-06-02   10          21
28         2013-06-02   11          15
29         2013-06-02   12          12
30         2013-06-02   13          11
31         2013-06-02   14          10
32         2013-06-02   15          16
33         2013-06-02   16          21
34         2013-06-02   17          22
35         2013-06-02   18          18
36         2013-06-02   19           9
37         2013-06-02   20           2
38         2013-06-02   21           0
39         2013-06-02   23           0", header = TRUE, as.is=T)

这是代码:

#make dummy data frame with all dates and hours
dummy <- as.data.frame(
  cbind(
    sort(rep(unique(values$Date),24)),
    rep(0:23,length(unique(values$Date)))))
colnames(dummy) <- c("Date","Hour")
dummy$Date <- as.character(dummy$Date)
dummy$Hour <- as.numeric(as.character(dummy$Hour))

#merge with values dataframe
values_v1 <- merge(dummy,values,all.x=T)

#substitute NAs with 0(zero)
values_v1[is.na(values_v1)] <- 0
于 2013-08-20T11:16:23.990 回答