r - 在 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。
你有什么建议?
谢谢
解决方案
我在您的数据中添加了更多观察结果。
# 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
) 函数将不起作用。如果没有丢失的日期,那么将数据转换为时间序列对象(“ts”)的正确方法是指定要转换的列(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
不要忽略任何缺失的日子。所以对于这个组成数据,如果你绘制了时间序列,那么你会得到错误的信息。
在这种情况下,可以使用xts和zoo等其他包来简单地工作。
library(xts)
x.xts <- xts(x.sum[,2:3], order.by=x.sum$Dates)
plot(x.xts) # Correct results.
推荐阅读
- python - 请指出我是如何设法创建一个无限循环的
- swift - SwiftUI 计算器中的结果没有小数位
- macos - 适用于 MacOS 的 Electron 桌面捕获器
- java - 在从 github 同步项目之前更改项目的 gradle 版本
- ios - Swift mapkit如何隐藏用户的定位销
- python - 如何在 Django Rest Framework 中为作为另一个模型的外键的模型添加附加字段
- javascript - 为什么我的背景图片在点击时没有变化
- vapor - Vapor 中的数据库播种和 Eager Loading
- python - PYODBC 多个游标
- css - 如何在 SASS [scale-color] 函数中使用 CSS 变量?