标签: zoo

在R中使用线性插值添加缺失的xts/zoo数据

我确实有丢失数据的问题,但我没有NA - 否则会更容易处理...

我的数据如下:

time, value
2012-11-30 10:28:00, 12.9
2012-11-30 10:29:00, 5.5
2012-11-30 10:30:00, 5.5
2012-11-30 10:31:00, 5.5
2012-11-30 10:32:00, 9
2012-11-30 10:35:00, 9
2012-11-30 10:36:00, 14.4
2012-11-30 10:38:00, 12.6
Run Code Online (Sandbox Code Playgroud)

正如你所看到的 - 缺少一些分钟值 - 它是xts/zoo所以我使用as.POSIXct ...来设置日期作为索引.如何添加缺少的时间步以获得完整的ts?我想用线性插值填充缺失值.

谢谢您的帮助!

r time-series zoo xts

7
推荐指数
2
解决办法
6108
查看次数

在预测之前将动物园转换为ts

我正在努力将zoo对象转换为ts对象.

我有一个巨大的data.frame"test",包含季度小时数据,如下所示:

date <- c("2010-07-04 09:45:00", "2010-07-04 10:00:00", "2010-07-04 10:15:00", "2010-07-04 10:30:00", "2010-07-04 10:45:00", "2010-07-04 11:00:00")
nrv <- c("-147.241", "-609.778", "-432.289", "-340.418", "-73.96" ,  "-533.108")
tt <- c("3510.7", "3608.5", "3835.7", "4003.7", "4018.8", "4411.9")
test <- data.frame(date,nrv,tt)
test
Run Code Online (Sandbox Code Playgroud)

我想做一些预测(大多数情况下ARIMA),并认为forecast包装将是一个好主意.我首先从字符中形成数据.

test$date <- strptime(test$date,format="%Y-%m-%d %H:%M")
test$nrv <- as.numeric(as.character(test$nrv))
test$tt <- as.numeric(as.character(test$tt))
str(test) #date is POSIXlt object
Run Code Online (Sandbox Code Playgroud)

由于我需要进行插值并构造滞后,我还使用了zoo使用日期变量作为索引的包,这非常有用.`zoo在处理时间序列数据时,我向我推荐了这个包.

library(zoo)
test.zoo <- zoo(test[,2:3],test[,1])
test.zoo #date is now the Index and and the zoo …
Run Code Online (Sandbox Code Playgroud)

r time-series zoo

7
推荐指数
1
解决办法
6421
查看次数

R:在yearqtr(动物园)的ggplot中设置scale_x_yearqtr的限制

我正在使用类似于以下摘录的数据集:

head(nomis.lng.agg)
  quarter decile           avg.val
1 2004 Q4                1 5.680000
2 2005 Q1                1 5.745763
3 2005 Q2                1 5.503341
4 2005 Q3                1 5.668224
5 2005 Q4                1 5.244604
6 2006 Q1                1 5.347222
Run Code Online (Sandbox Code Playgroud)

变量quarter是由class yearqtr生成的zoo.其余两列是数字.我目前正在生成使用以下ggplot语法的绘图:

ggplot(data = subset(x = df,
                     subset = df$decile== 1 |
                         df$decile== 10),
       aes(x = quarter, y = avg.val, group = decile)) +
    geom_line(aes(linetype=as.factor(decile)),
              size = 1) +
    scale_x_yearqtr(format = "%YQ%q", n  = 5) +
    xlab("Quarter") + …
Run Code Online (Sandbox Code Playgroud)

r time-series ggplot2 zoo as.date

7
推荐指数
1
解决办法
3855
查看次数

R:按组插入 NA

我想在数据帧的变量中执行线性插值,其中考虑到:1)两点之间的时间差,2)获取数据的时刻以及 3)为测量变量而采取的个人。

例如在下一个数据框中:

 df <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3),
            Individuals=c(1,1,1,1,1,1,1,2,2,2),
            Value=c(1, 2, 3, NA, 5, NA, 7, 5, NA, 7))
  df
Run Code Online (Sandbox Code Playgroud)

我想获得:

 result <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3),
                Individuals=c(1,1,1,1,1,1,1,2,2,2),
                Value=c(1, 2, 3, 4, 5, 6, 7, 5, 5.5, 6))
 result
Run Code Online (Sandbox Code Playgroud)

我不能完全使用na.approx包的功能,zoo因为所有观察都不是连续的,一些观察属于一个人,其他观察属于其他人。原因是因为如果第二个人将第一次观察到NA而我将专门使用该功能na.approx,我将使用来自 的信息individual==1来插入NAindividual==2(例如,下一个数据帧将有此类错误)

  df_2 <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3),
                Individuals=c(1,1,1,1,1,1,1,2,2,2),
                Value=c(1, 2, 3, NA, 5, NA, 7, NA, 5, 7))
  df_2
Run Code Online (Sandbox Code Playgroud)

我试过使用这些包zoodplyr

library(dplyr)
library(zoo)
proof <- df %>%
  group_by(Individuals) %>%
  na.approx(df$Value)
Run Code Online (Sandbox Code Playgroud)

但我不能 …

group-by r linear-interpolation zoo dplyr

7
推荐指数
2
解决办法
5007
查看次数

Error when performing an NA replacement in R 4.0

使用 R 3.6 我可以执行以下 NA 替换

> d <- zoo(data.frame(a = NA, b = 1), Sys.Date())
> d[is.na(d)] <- 1
> d
           a b
2021-03-03 1 1
Run Code Online (Sandbox Code Playgroud)

使用 R 4.0 我收到以下错误:

> d <- zoo(data.frame(a = NA, b = 1), Sys.Date())
> d[is.na(d)] <- 1
Error in as.Date.default(e) : 
  do not know how to convert 'e' to class “Date”
Run Code Online (Sandbox Code Playgroud)

R 4.0 中的某些默认行为是否发生了变化?

R 3.6 会话信息:

Microsoft Windows [Version 10.0.19041.804]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\>R --no-site-file

R version …
Run Code Online (Sandbox Code Playgroud)

r zoo

7
推荐指数
1
解决办法
121
查看次数

将不规则时间序列拆分为常规月平均值 - R.

为了对能源使用产生季节性影响,我需要将计费数据库中的能源使用信息与月度温度保持一致.

我正在使用具有不同长度和开始日期和结束日期的帐单的结算数据集,并且我想获得每个月内每个帐户的月平均值.例如,我有一个具有以下特征的计费数据库:

   acct amount      begin        end days
1  2242  11349 2009-10-06 2009-11-04   29
2  2242  12252 2009-11-04 2009-12-04   30
3  2242  21774 2009-12-04 2010-01-08   35
4  2242  18293 2010-01-08 2010-02-05   28
5  2243  27217 2009-10-06 2009-11-04   29
6  2243    117 2009-11-04 2009-12-04   30
7  2243  14543 2009-12-04 2010-01-08   35
Run Code Online (Sandbox Code Playgroud)

我想弄清楚如何强制这些有点不规则的时间序列(对于每个帐户)来获得每个月内每个月内的平均金额,以便:

   acct amount      begin        end days avgamtpday
1  2242  11349 2009-10-01 2009-10-31   31          X
2  2242  12252 2009-11-01 2009-11-30   30          X
3  2242  21774 2009-12-01 2010-12-31   31          X
4  2242  18293 …
Run Code Online (Sandbox Code Playgroud)

sql r zoo xts data.table

6
推荐指数
1
解决办法
1705
查看次数

为什么在使用xts/zoo的R中没有apply.hourly?

我想按小时平均汇总数据.每日很容易:

apply.daily(X2,mean)
Run Code Online (Sandbox Code Playgroud)

为什么每小时没有功能?我试过了

hr.means <- aggregate(X2, format(X2["timestamp"],"%Y-%m-%d %H"))
Run Code Online (Sandbox Code Playgroud)

并且修剪参数总是出错.是否有类似apply.daily的更简单的功能?如果我想聚合5分钟的平均值怎么办?数据是每分钟的值:

"timestamp", value 
"2012-04-09 05:03:00",2
"2012-04-09 05:04:00",4
"2012-04-09 05:05:00",5
"2012-04-09 05:06:00",0
"2012-04-09 05:07:00",0
"2012-04-09 05:08:00",3
"2012-04-09 05:09:00",0
"2012-04-09 05:10:00",1
Run Code Online (Sandbox Code Playgroud)

我正在使用xts和动物园.

r time-series zoo xts

6
推荐指数
1
解决办法
4388
查看次数

6
推荐指数
1
解决办法
6175
查看次数

使用R来区分图中主要数据的缺失值

我创建了一个虚拟时间序列xts对象,其日期为2-09-2015,缺少数据:

library(xts)
library(ggplot2)
library(scales)

set.seed(123)
seq <- seq(as.POSIXct("2015-09-01"),as.POSIXct("2015-09-02"), by = "1 hour")
ob1 <- xts(rnorm(length(seq),150,5),seq)
seq2 <- seq(as.POSIXct("2015-09-03"),as.POSIXct("2015-09-05"), by = "1 hour")
ob2 <- xts(rnorm(length(seq2),170,5),seq2)
final_ob <- rbind(ob1,ob2)
plot(final_ob)
# with ggplot
df <- data.frame(time = index(final_ob), val = coredata(final_ob) )
ggplot(df, aes(time, val)) + geom_line()+ scale_x_datetime(labels = date_format("%Y-%m-%d"))
Run Code Online (Sandbox Code Playgroud)

在绘制我的数据之后看起来像这样: 在此输入图像描述

红色矩形部分表示缺少数据的日期.如何在主图中显示当天缺少数据?

我想我应该用不同的颜色显示这个缺失的数据.但是,我不知道如何处理数据以反映主图中缺少的数据行为.

r time-series zoo xts

6
推荐指数
1
解决办法
387
查看次数

滚动将数据表中的多个分位数应用于多列

背景:
我可以使用 data.table(见附件)从我的数据中获取多个时刻,但这需要很长时间。我在想,对表格进行排序以获得特定百分位数的过程会更有效地找到几个。

像中值这样的一次性统计需要 1.79 毫秒,而非中值分位数需要 68 倍的时间,为 122.8 毫秒。必须有一种方法来减少计算时间。

问题:

  • 有没有办法以更有效的方式从同一数据中调用多个分位数?
  • 我可以从 data.table 中提取“lapply”并像我做名字列表一样编写它吗?

我的带有微小合成数据的示例代码:

#libraries
library(data.table)      #data.table
library(zoo)             #roll apply

#reproducibility
set.seed(45L)

#make data
DT<-data.table(V1=c(1L,2L),
               V2=LETTERS[1:3],
               V3=round(rnorm(300),4),
               V4=round(runif(150),4),
               V5=1:1200)
DT

#get names
my_col_list <- names(DT)[c(3,4)]

#make new variable names
my_name_list1 <- paste0(my_col_list, "_", "33rd_pctile")
my_name_list2 <- paste0(my_col_list, "_", "77rd_pctile")

#compute values
for(i in 1:length(my_col_list)){
     #first 
     DT[, (my_name_list1[i]) := unlist(lapply(.SD,
                                          function(x) rollapply(x,
                                                                7,
                                                                quantile,
                                                                fill = NA,
                                                                probs = 1/3)), 
                                   recursive = F),
        .SDcols = my_col_list[i]]
     #second
     DT[, (my_name_list2[i]) …
Run Code Online (Sandbox Code Playgroud)

performance r median zoo data.table

6
推荐指数
1
解决办法
896
查看次数