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