首页 > 解决方案 > 在 R 中将数据帧转换为 TS

问题描述

我一直在尝试将我放在一起的数据框转换为时间序列,但由于某种原因它不起作用。我对 R 很陌生。

    x<-Sales_AEMBG%>%
+   select(Ecriture.DatEcr, Crédit, Mapping)
> names(x)<-c("Dates","Revenue","Mapping")
> str(x)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   15167 obs. of  3 variables:
 $ Dates  : POSIXct, format: "2016-01-02" "2016-01-02" "2016-01-02" "2016-01-02" ...
 $ Revenue: num  124065 214631 135810 225293 57804 ...
 $ Mapping: chr  "E.M 1.5 L" "E.M 1.5 L" "E.M 1.5 L" "E.M 1.5 L" ...'

当我尝试查看数据时,这就是我所拥有的

> head(x)
# A tibble: 6 x 3
  Dates               Revenue Mapping  
  <dttm>                <dbl> <chr>    
1 2016-01-02 00:00:00 124065. E.M 1.5 L
2 2016-01-02 00:00:00 214631. E.M 1.5 L
3 2016-01-02 00:00:00 135810. E.M 1.5 L
4 2016-01-02 00:00:00 225293. E.M 1.5 L
5 2016-01-02 00:00:00  57804. E.M 1.5 L
6 2016-01-02 00:00:00 124065. E.M 1.5 L

当然,我尝试了 as.ts 功能

 > x_xts <- as.ts(x)
Warning message:
In data.matrix(data) : NAs introduced by coercion
> is.ts(x)
[1] FALSE

但它一直告诉我,我的数据框仍未被识别为 TS。

你有什么建议?

谢谢

标签: rdataframetime-series

解决方案


我在您的数据中添加了更多观察结果。

# A tibble: 12 x 3
   Dates               Revenue Mapping  
   <dttm>                <dbl> <chr>    
 1 2016-01-02 00:00:00  124065 E.M 1.5 L
 2 2016-01-02 00:00:00  214631 E.M 1.5 L
 3 2016-01-03 00:00:00  135810 E.M 1.5 L
 4 2016-01-03 00:00:00  225293 E.M 1.5 L
 5 2016-01-05 00:00:00   57804 E.M 1.5 L
 6 2016-01-05 00:00:00  124065 E.M 1.5 L
 7 2016-01-02 00:00:00   24065 E.M 1.5 M
 8 2016-01-02 00:00:00   14631 E.M 1.5 M
 9 2016-01-03 00:00:00   35810 E.M 1.5 M
10 2016-01-03 00:00:00   25293 E.M 1.5 M
11 2016-01-05 00:00:00    7804 E.M 1.5 M
12 2016-01-05 00:00:00   24065 E.M 1.5 M

首先,您需要将销售额按天 ( Dates) 和产品类型(您的Mapping变量?)相加,然后转换为更广泛的数据格式:

library(dplyr)
library(tidyr)

x.sum <- x %>%
  group_by(Mapping, Dates) %>%
  summarise(Revenue=sum(Revenue)) %>%
  pivot_wider(id_cols=Dates, names_from=Mapping, values_from=Revenue)

# A tibble: 3 x 3
  Dates               `E,M 1.5 L` `E,M 1.5 M`
  <dttm>                    <dbl>       <dbl>
1 2016-01-02 00:00:00      338696       38696
2 2016-01-03 00:00:00      361103       61103
3 2016-01-05 00:00:00      181869       31869

请注意,我故意省略了 1 月 4 日。

如果您的时间序列数据缺少日期,例如金融市场在周末休市的股票价格,则使用as.ts(或ts) 函数将不起作用。如果没有丢失的日期,那么将数据转换为时间序列对象(“t​​s”)的正确方法是指定要转换的列(x.sum[,2:3])和开始(2016 年 1 月 2 日)和频率(每天) 系列。

x.ts <- ts(x.sum[,2:3], start=c(2016, 2), frequency=365)

开始时要小心,因为第二个参数取决于指定的频率。这里,365 表示每天,所以“2”表示 2016 年的第 2 天。如果频率是每月,“2”表示 2016 年的第 2 个月。

但正如我所提到的,ts不要忽略任何缺失的日子。所以对于这个组成数据,如果你绘制了时间序列,那么你会得到错误的信息。

在这种情况下,可以使用xtszoo等其他包来简单地工作。

library(xts)
x.xts <- xts(x.sum[,2:3], order.by=x.sum$Dates)

plot(x.xts) # Correct results.

关于时间序列的其他答案可以在这里这里找到。


推荐阅读