2017-04-14 56 views
1

我是R语言的新手。我正在使用可用于每天销售数据的选项卡分隔文本文件。格式将如product-id,day0,day1,day2,day3等。输入文件的一部分下面在R中将data.frame转换为时间序列对象时遇到困难?

productid 0 1 2 3 4 5 6 
1   53 40 37 45 69 105 62 
4   0 0 2 4 0 8 0 
5   57 133 60 126 90 87 107 
6   108 130 143 92 88 101 66 
10   0 0 2 0 4 0 36 
11   17 22 16 15 45 32 36 

给出我用下面的代码来读取文件

pdInfo <- read.csv("products.txt",header = TRUE, sep="\t") 

这允许读取整个文件,变量x是数据帧。我想将data.frame x更改为时间序列对象,以便进一步处理。在静态测试中,Dickey-Fuller测试(ADF)会显示错误。我想下面的代码,提前为建议

回答

2

在该R

x <- ts(data.matrix(pdInfo),frequency = 1) 
adf <- adf.test(x) 

    error: Error in adf.test(x) : x is not a vector or univariate time series 

谢谢,时间序列通常形式为“每列显示一个日期”,你的数据在表格“每一个列日期”。在转换为ts对象之前,您可能需要转置数据。

一转吧:

y= t(pdInfo) 

然后使顶行(即产品标识的)到该行标题

colnames(y) = y[1,] 
y= y[-1,] # to drop the first row 

这应该工作:

x = ts(y, frequency = 1) 
+0

谢谢@lebelinoz。转换为时间序列发生没有任何错误。但执行adf.test(x)会显示错误,因为“x不是矢量或单变量时间序列”。 – Rajan

-1
library(purrr) 
library(dplyr) 
library(tidyr) 
library(tseries) 

# create the data 

df <- structure(list(productid = c(1L, 4L, 5L, 6L, 10L, 11L), 
        X0 = c(53L, 0L, 57L, 108L, 0L, 17L), 
        X1 = c(40L, 0L, 133L, 130L, 0L, 22L), 
        X2 = c(37L, 2L, 60L, 143L, 2L, 16L), 
        X3 = c(45L, 4L, 126L, 92L, 0L, 15L), 
        X4 = c(69L, 0L, 90L, 88L, 4L, 45L), 
        X5 = c(105L, 8L, 87L, 101L, 0L, 32L), 
        X6 = c(62L, 0L, 107L, 66L, 36L, 36L)), 
       .Names = c("productid", "0", "1", "2", "3", "4", "5", "6"), 
       class = "data.frame", row.names = c(NA, -6L)) 

# apply adf.test to each productid and return p.value 

adfTest <- df %>% gather(key = day, value = sales, -productid) %>% 
    arrange(productid, day) %>% 
    group_by(productid) %>% 
    nest() %>% 
    mutate(adf = data %>% map(., ~adf.test(as.ts(.$sales))) 
    ,adf.p.value = adf %>% map_dbl(., "p.value")) %>% 
    select(productid, adf.p.value) 
相关问题