Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何创建;不适用;查找时间序列中的缺失数据_R_Time Series_Missing Data - Fatal编程技术网

R 如何创建;不适用;查找时间序列中的缺失数据

R 如何创建;不适用;查找时间序列中的缺失数据,r,time-series,missing-data,R,Time Series,Missing Data,我有几个数据文件如下所示: X code year month day pp 1 4515 1953 6 1 0 2 4515 1953 6 2 0 3 4515 1953 6 3 0 4 4515 1953 6 4 0 5 4515 1953 6 5 3.5 有时会丢失数据,但我没有NAs,这些行根本不存在。我需要在数据丢失时创建NAs。我想我可以通过将其转换为zoo对象并检查严格的规则性(我以前从未使

我有几个数据文件如下所示:

X code year month day pp  
1 4515 1953     6   1  0  
2 4515 1953     6   2  0  
3 4515 1953     6   3  0  
4 4515 1953     6   4  0  
5 4515 1953     6   5  3.5
有时会丢失数据,但我没有NAs,这些行根本不存在。我需要在数据丢失时创建NAs。我想我可以通过将其转换为zoo对象并检查严格的规则性(我以前从未使用过zoo)来确定何时发生这种情况,我使用了以下代码:

z.date<-paste(CET$year, CET$month, CET$day, sep="/")
z <- read.zoo(CET,  order.by= z.date )
reg<-is.regular(z, strict = TRUE)
z.date在zoo软件包中,“常规”表示序列间隔相等,但可能缺少一些条目。zoo软件包中的
zooreg
类专门用于该系列。请注意,所有规则系列的集合包括所有等距系列的集合,但严格地说更大

is.regular
函数检查给定序列是否为正则序列。也就是说,如果为缺失条目插入NAs,序列是否可以使其等距排列

关于你的最后一个问题,这是一个常见问题。参见动物园常见问题解答中的常见问题解答#13,可从或从R内通过以下途径获得:

vignette("zoo-faq") 

在常见问题解答13中还有一些说明性代码。

首先要注意的是,
z.date
是字符,而不是日期

下面是我如何使用xts(zoo的一个子类)解决您的问题

#从样本数据中删除第三个obs

CETseq
函数有一些有趣的功能,您可以使用这些功能轻松生成完整的日期序列。例如,以下代码可用于生成从4月25日开始的日期序列:

编辑:此功能记录在
?seq.Date

start = as.Date("2011/04/25")
full <- seq(start, by='1 day', length=15)
full

 [1] "2011-04-25" "2011-04-26" "2011-04-27" "2011-04-28" "2011-04-29"
 [6] "2011-04-30" "2011-05-01" "2011-05-02" "2011-05-03" "2011-05-04"
[11] "2011-05-05" "2011-05-06" "2011-05-07" "2011-05-08" "2011-05-09"
要将此结果与原始完整数据相结合,请执行以下操作:

data.frame(Date=full, value=with(partial, value[match(full, date)]))
         Date value
1  2011-04-25     1
2  2011-04-26    NA
3  2011-04-27     2
4  2011-04-28    NA
5  2011-04-29     3
6  2011-04-30    NA
7  2011-05-01     4
8  2011-05-02    NA
9  2011-05-03     5
10 2011-05-04    NA
11 2011-05-05     6
12 2011-05-06    NA
13 2011-05-07    NA
14 2011-05-08    NA
15 2011-05-09    NA

我必须用一个月的时间序列来处理类似的问题。我通过时间变量直接连接两个
data.table
/
data.frame
。我的观点是,时间序列也是一种数据集。因此,您还可以以常规方式将任何时间序列作为常规数据集进行操作。以下是我的解决方案:

library(zoo)    
(full <- data.table(yrAndMo = as.yearmon(seq(as.Date('2008-01-01'), by = '1 month', length = someLength)))) 
# the full time horizon that you want to have
#  yrAndMo
#  1: Jan 2008
#  2: Feb 2008
#  3: Mar 2008
#  4: Apr 2008
#  5: May 2008
# ---         
# 98: Feb 2016
# 99: Mar 2016
# 100: Apr 2016
# 101: May 2016
# 102: Jun 2016

exampleDat # the actually data you want to append to the full time horizon
# yrAndMo someValue
# 1 Mar 2010      7500
# 2 Jun 2010      1115
# 3 Mar 2011      2726
# 4 Apr 2011      1865
# 5 Nov 2011      1695
# 6 Dec 2012     10000
# 7 Mar 2016      1000

library(plyr)
join(full, exampleDat, by = 'yrAndMo', type = "left")
#   yrAndMo someValue
#   1: Jan 2008        NA
#   2: Feb 2008        NA
#   3: Mar 2008        NA
#   4: Apr 2008        NA
#   5: May 2008        NA
#  ---                   
#  98: Feb 2016        NA
#  99: Mar 2016      1000
# 100: Apr 2016        NA
# 101: May 2016        NA
# 102: Jun 2016        NA
图书馆(动物园)

(完整您的意思是您的数据在某些日期中不包含行吗?这与您的前两列(X和代码)有何关系?+1表示很酷的未记录技巧。然后:它被记录为:?seq.Date(:@Nick谢谢你告诉我在哪里可以找到这些文档。我五分钟前使用我最喜欢的搜索引擎在R邮件列表中发现了这一功能,但在?seq中找不到任何与此相关的引用。timeBasedSeq函数会重复它创建的某些天!这会导致zoo出现问题,因为“order.by”中的索引项不是唯一的。例如,基于时间的Seq(“19860601/19861231”)将创建…“1986-10-25”“1986-10-26”“1986-10-26”“1986-10-26”“1986-10-27”…我如何避免这种情况?
with(partial, value[match(full, date)])
 [1]  1 NA  2 NA  3 NA  4 NA  5 NA  6 NA NA NA NA
data.frame(Date=full, value=with(partial, value[match(full, date)]))
         Date value
1  2011-04-25     1
2  2011-04-26    NA
3  2011-04-27     2
4  2011-04-28    NA
5  2011-04-29     3
6  2011-04-30    NA
7  2011-05-01     4
8  2011-05-02    NA
9  2011-05-03     5
10 2011-05-04    NA
11 2011-05-05     6
12 2011-05-06    NA
13 2011-05-07    NA
14 2011-05-08    NA
15 2011-05-09    NA
library(zoo)    
(full <- data.table(yrAndMo = as.yearmon(seq(as.Date('2008-01-01'), by = '1 month', length = someLength)))) 
# the full time horizon that you want to have
#  yrAndMo
#  1: Jan 2008
#  2: Feb 2008
#  3: Mar 2008
#  4: Apr 2008
#  5: May 2008
# ---         
# 98: Feb 2016
# 99: Mar 2016
# 100: Apr 2016
# 101: May 2016
# 102: Jun 2016

exampleDat # the actually data you want to append to the full time horizon
# yrAndMo someValue
# 1 Mar 2010      7500
# 2 Jun 2010      1115
# 3 Mar 2011      2726
# 4 Apr 2011      1865
# 5 Nov 2011      1695
# 6 Dec 2012     10000
# 7 Mar 2016      1000

library(plyr)
join(full, exampleDat, by = 'yrAndMo', type = "left")
#   yrAndMo someValue
#   1: Jan 2008        NA
#   2: Feb 2008        NA
#   3: Mar 2008        NA
#   4: Apr 2008        NA
#   5: May 2008        NA
#  ---                   
#  98: Feb 2016        NA
#  99: Mar 2016      1000
# 100: Apr 2016        NA
# 101: May 2016        NA
# 102: Jun 2016        NA