我知道这已被问过几次,但我找不到解决问题的正确方法。我上传了一个非常简单的CSV文件,如下所示:
27.07.2015,100
28.07.2015,100.1504
29.07.2015,100.1957
30.07.2015,100.5044
31.07.2015,100.7661
03.08.2015,100.9308
04.08.2015,100.8114
05.08.2015,100.6927
06.08.2015,100.7501
07.08.2015,100.7194
10.08.2015,100.8197
11.08.2015,100.8133
现在我需要将data.frame转换为xts,以便我可以使用PerformanceAnalytics包。我的data.frame有结构:
> str(mpey)
'data.frame': 243 obs. of 2 variables:
$ V1: Factor w/ 243 levels "01.01.2016","01.02.2016",..: 210 218 228 234 241 21 30 38 45 52 ...
- attr(*, "names")= chr "5" "6" "7" "8" ...
$ V2: Factor w/ 242 levels "100","100.0062",..: 1 4 5 10 16 20 17 13 15 14 ...
- attr(*, "names")= chr "5" "6" "7" "8" ...
我尝试使用as.xts
函数做了不同的事情但可以使它工作。
你能帮我解决这个问题吗?
答案 0 :(得分:0)
这是一个使用tidyquant
包的解决方案,其中包含用于将数据帧强制转换为xts对象的as_xts()
和用于强制时间序列对象(如xts到tibbles)的as_tibble()
(“整齐”数据帧)。
重新创建数据
> data_df
# A tibble: 12 × 2
date value
<fctr> <fctr>
1 27.07.2015 100
2 28.07.2015 100.1504
3 29.07.2015 100.1957
4 30.07.2015 100.5044
5 31.07.2015 100.7661
6 03.08.2015 100.9308
7 04.08.2015 100.8114
8 05.08.2015 100.6927
9 06.08.2015 100.7501
10 07.08.2015 100.7194
11 10.08.2015 100.8197
12 11.08.2015 100.8133
首先,我们需要重新格式化您的数据框。日期和值都存储为因子,它们分别需要在日期和双重类中。我们将加载tidyquant
并重新格式化数据框。请注意,tidyquant
会加载tidyverse
和财务包,因此您无需加载任何其他内容。可以使用lubridate::dmy
转换日期,该日期将日 - 月 - 年格式的字符转换为日期。值需要从因素到字符,然后从字符变为双精度,这可以通过嵌套as.numeric
和as.character
来完成。
> library(tidyquant)
> data_tib <- data_df %>%
mutate(date = dmy(date),
value = as.numeric(as.character(value)))
> data_tib
# A tibble: 12 × 2
date value
<date> <dbl>
1 2015-07-27 100.0000
2 2015-07-28 100.1504
3 2015-07-29 100.1957
4 2015-07-30 100.5044
5 2015-07-31 100.7661
6 2015-08-03 100.9308
7 2015-08-04 100.8114
8 2015-08-05 100.6927
9 2015-08-06 100.7501
10 2015-08-07 100.7194
11 2015-08-10 100.8197
12 2015-08-11 100.8133
现在,我们可以使用xts
功能强制tidyquant::as_xts()
。只需指定date_col = date
。
> data_xts <- data_tib %>%
as_xts(date_col = date)
> data_xts
value
2015-07-27 100.0000
2015-07-28 100.1504
2015-07-29 100.1957
2015-07-30 100.5044
2015-07-31 100.7661
2015-08-03 100.9308
2015-08-04 100.8114
2015-08-05 100.6927
2015-08-06 100.7501
2015-08-07 100.7194
2015-08-10 100.8197
2015-08-11 100.8133