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

R 如何用值0填充缺少的数据(不是NA值)?,r,R,我的数据如下: Date Value 00:00 10 01:00 8 02:00 1 04:00 4 ... 如果值=0,则缺少某些数据。我的问题是如何重新填写这些数据。例如,在02:00 17之后,填写一行03:00 0 我做了一些搜索,但只找到了用0替换NAs的解决方案。在我的例子中,我的数据甚至没有显示在数据框中。是否有办法检查相邻数据之间是否存在间隙?以下是使用数据的方法。表: library(data.table) data = data.fram

我的数据如下:

 Date Value
00:00    10
01:00     8
02:00     1
04:00     4
...
如果
值=0
,则缺少某些数据。我的问题是如何重新填写这些数据。例如,在
02:00 17
之后,填写一行
03:00 0


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

以下是使用
数据的方法。表

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]

我可以在base 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
  • 或者,您可以在向量中给出所需的准确小时数,或者取所需时间与所拥有时间之间的设定差,然后对结果排序:

  • ##明确给出时间
    
    关于
    dd,你能再举一些例子说明你想做什么吗?我不太明白你在说什么“比如,在02:00 17之后,填一行03:00 0”——你是指02:00 1吗?另一种方式,只是为了好玩:
    data[,data.table(Date=seq(min(Date),max(Date),by='1 day'),Value=0,key=“Date”)][data,Value:=I.Value][]
    也许我应该升级
    data.table的版本,因为key不是我这边的
    setDT
    的有效参数?非常好的一行代码,我无法与data.table开发者竞争;)谢谢:-)。在
    setDT()
    上,它还没有
    参数。。。我大声地想:-)。做
    setDT(…,key=)
    比做
    setkey(setDT(…),…)
    更好。谢谢上校和阿伦。我犯了一个错误,理解起来有些困难
    setkey(setDT(data),Date)
    正在将“Date”列设置为“data”的键,对吗?
    [dt]
    正在进行连接,因此在连接之后,缺少的值将是“NA”s<代码>[!数据,值:=0]
    是否将NA替换为0?最后两个括号是什么意思@Beauvel上校@ArunHi Sophie,你的解释都是正确的!最后一个括号只是在控制台中显示如此创建的
    数据.table
    的一种方式(您可以通过省略它们来键入命令并查看差异)。您还可以执行
    result=setkey(setDT(data),Date)[dt][!data,Value:=0]
    然后键入
    result
    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
    
    ## 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