【问题标题】:converting data frame (factors) into xts将数据框(因子)转换为 xts
【发布时间】:2016-11-03 16:40:19
【问题描述】:

我知道这个问题已被多次询问,但我找不到解决问题的正确方法。我上传了一个非常简单的 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 函数尝试了不同的东西,但可以让它工作。 你能帮我解决这个问题吗?

【问题讨论】:

  • V1 是一个因素,也许将其更改为字符或日期类? V2 是因素,也许您可​​能需要将其更改为数字。
  • 已经试过了,但我不能。它总是给我 *** as.Date.factor(mpey[,1]) charToDate(x) 中的错误:字符串不是标准的明确格式,或者如果我尝试 *** > as.Date(mpey[, 1]) charToDate(x) 中的错误:字符串不是标准的明确格式
  • 当我添加格式 =“%d/%m/%Y”时,我得到 252 NA 行.....
  • 添加format = "%d/%m/%Y" 将不起作用,因为您的日期与"27/07/2015" 不同。使用format = "%d.%m.%Y"。如果read.table 将其转换为因子,则您的V2 数据有问题。您需要查看该列中非数字字符的原始 CSV。您可以首先在 R 中将 V2 转换为数字,然后找到由于无法转换为数字而被强制转换为 NA 的行。

标签: r dataframe xts performanceanalytics


【解决方案1】:

这是使用tidyquant 包的解决方案,其中包含as_xts() 用于将数据帧强制转换为xts 对象,as_tibble() 用于将时间序列对象(例如xts)强制转换为小标题(“整洁”数据帧)。

重新创建您的数据

> 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

现在,我们可以使用tidyquant::as_xts() 函数强制转换为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

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2022-01-07
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多