如何用值0填充缺失数据(不是NA值)?

时间:2015-04-09 09:00:11

标签: r

我的数据如下:

 Date Value
00:00    10
01:00     8
02:00     1
04:00     4
...

如果value=0,则会丢失一些数据。我的问题是如何填充这些数据。就像在02:00 17之后,填写一行03:00 0

我做了一些搜索,但只找到了用NAs替换0的解决方案。就我而言,我的数据甚至没有显示在数据框中。有没有办法检查相邻数据之间是否存在差距?

2 个答案:

答案 0 :(得分:3)

以下是使用data.table的方法:

library(data.table)

data = data.frame(Date=as.Date(c('2015-03-20','2015-03-24','2015-03-25','2015-03-28')), 
                  Value=c(1,2,3,4)) 

#        Date Value
#1 2015-03-20     1
#2 2015-03-24     2
#3 2015-03-25     3
#4 2015-03-28     4

dt = data.table(Date=seq(min(data$Date), max(data$Date), by='days'))
setkey(setDT(data), Date)[dt][!data, Value:=0][]

#         Date Value
#1: 2015-03-20     1
#2: 2015-03-21     0
#3: 2015-03-22     0
#4: 2015-03-23     0
#5: 2015-03-24     2
#6: 2015-03-25     3
#7: 2015-03-26     0
#8: 2015-03-27     0
#9: 2015-03-28     4

它基本上是重新采样表上的连接 - setkey(setDT(data), Date)[dt] - 你想要(你必须定义它,这里是dt)。然后,使用0 - [!data, Value:=0]

替换原始数据集中不存在的值

答案 1 :(得分:2)

我可以在基础r中考虑两种简单的方法:

s <- format(seq(s <- as.POSIXct('2000-01-01'), s + 3.6e4, by = 'hour'), '%H:%M')
# [1] "00:00" "01:00" "02:00" "03:00" "04:00" "05:00" "06:00" "07:00" "08:00"
# [10] "09:00" "10:00"
ss <- s[c(1:3, 5)]
dd <- data.frame(hour = ss, value = c(10, 8, 1, 4), stringsAsFactors = FALSE)

#    hour value
# 1 00:00    10
# 2 01:00     8
# 3 02:00     1
# 4 04:00     4

我制作了两个示例向量,s是您要填写的时间,ss是数据框中的时间。大概你已经拥有了这两个,所以你可以

  1. 使用您想要的时间顺序创建一个数据框,并将两者合并到all = TRUE,这样就没有重复项;然后将NA替换为0

  2. dm <- data.frame(hour = s)
    out <- merge(dm, dd, all = TRUE)
    
    #     hour value
    # 1  00:00    10
    # 2  01:00     8
    # 3  02:00     1
    # 4  03:00    NA
    # 5  04:00     4
    # 6  05:00    NA
    # 7  06:00    NA
    # 8  07:00    NA
    # 9  08:00    NA
    # 10 09:00    NA
    # 11 10:00    NA
    
    out[is.na(out)] <- 0
    
    #     hour value
    # 1  00:00    10
    # 2  01:00     8
    # 3  02:00     1
    # 4  03:00     0
    # 5  04:00     4
    # 6  05:00     0
    # 7  06:00     0
    # 8  07:00     0
    # 9  08:00     0
    # 10 09:00     0
    # 11 10:00     0
    
    1. 或者你可以在矢量中给出你想要的确切时间,或者在你想要的时间和你拥有的时间之间取得设定的差异并订购结果:

    2. ## giving the times explicitly
      out <- rbind(dd, data.frame(hour = sprintf('%02s:00', c(3, 5:10)), value = 0))
      ## or more programmatically:
      out <- rbind(dd, data.frame(hour = setdiff(s, dd$hour),
                                  value = 0))
      out[order(out$hour), ]
      
      #     hour value
      # 1  00:00    10
      # 2  01:00     8
      # 3  02:00     1
      # 5  03:00     0
      # 4  04:00     4
      # 6  05:00     0
      # 7  06:00     0
      # 8  07:00     0
      # 9  08:00     0
      # 10 09:00     0
      # 11 10:00     0