单数据列DataFrame转换为XTS丢失列名的原因与解决方法
单非日期列转换XTS丢失列名的原因与解决方法
问题根源
该问题源于R语言对data.frame取子集时的默认降维规则:
- 当原数据存在2列及以上非日期列时,执行
DF[,-1]去除Date列后,结果仍为data.frame对象,原有列名属性会被完整保留,xts()可正常读取列名并赋值给生成的XTS对象 - 当原数据仅存在1个非日期列时,
[操作符默认开启drop = TRUE参数,会自动将单列data.frame降维为无列名的原子向量,传递给xts()的输入本身已经丢失列名,最终生成的XTS自然无法保留原有列名。
可通过以下代码验证两类输入的对象差异:
# 多列非日期的情况 class(DF[,-1]) # [1] "data.frame" # 单列非日期的情况 class(DF.subset[,-1]) # [1] "numeric"
兼容单/多列场景的通用解决方法
提取非日期列时,显式指定drop = FALSE参数,强制R始终保留data.frame结构,完全无需预先判断非日期列的数量:
# 无论非日期列是1个还是多个,以下代码逻辑完全通用 DF.TS <- xts(DF[,-1, drop = FALSE], order.by = dv) DF.subset.TS <- xts(DF.subset[,-1, drop = FALSE], 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) C1 2010-01-31 1 2010-02-28 2 2010-03-31 3 colnames(DF.TS) # [1] "C1" "C2" colnames(DF.subset.TS) # [1] "C1"
若已经生成了丢失列名的XTS对象,也可在生成后手动指定列名:
colnames(DF.subset.TS) <- "C1"
内容的提问来源于stack exchange,提问作者K.RAC
相关产品推荐
相关产品推荐

