将单列 Dataframe 转换为 XTS 会丢失列名

问题描述

我遇到了需要将数据框对象转换为 XTS 对象的情况。我的数据框的第一列始终是日期对象,并且始终命名为“日期”。但是,我不知道先验,我的数据框对象是否有 1 列(不包括日期)或更多列。

问题是这样的:当我尝试使用 xts() 将数据帧对象转换为 xts 时,当数据帧对象具有超过 1 列时,生成的 XTS 对象具有正确的列名。但是如果它只有一个数据列(不包括日期),它就会失去它的列名。请参阅下面的代码

dv <- as.Date(c("2010-01-31","2010-02-28","2010-03-31"))
DF <- data.frame(Date = dv,C1 = c(1,2,3),C2 = c(10,20,30))
DF.subset <- data.frame(Date = dv,3))


DF.TS <- xts(DF[,-1],order.by =dv)
DF.subset.TS <- as.xts(DF.subset[,order.by =dv)



> head(DF.TS)
           C1 C2
2010-01-31  1 10
2010-02-28  2 20
2010-03-31  3 30

> head(DF.subset.TS)
           [,1]
2010-01-31    1
2010-02-28    2
2010-03-31    3

> colnames(DF.TS)
[1] "C1" "C2"
> colnames(DF.subset.TS)
NULL

为什么我会在第二个实例 (DF.subset.TS) 中丢失列名(以及如何避免丢失它)? 任何帮助都非常感谢。

解决方法

当数据中只有一列时,默认性质是删除其维度并将其转换为向量。

DF.subset[,-1]
#[1] 1 2 3

为了避免这种情况并将数据帧保留为数据帧,您可以使用 drop = FALSE

DF.subset[,-1,drop = FALSE]

#  C1
#1  1
#2  2
#3  3

现在在 xts 函数中使用它。

library(xts)
DF.TS <- xts(DF[,drop = FALSE],order.by =dv)
DF.subset.TS <- as.xts(DF.subset[,order.by =dv)

colnames(DF.TS)
#[1] "C1" "C2"
colnames(DF.subset.TS)
#[1] "C1"