merge.xts 未使用 R 合并所有数据

merge.xts not merging all data using R

我正在尝试对以下 xts 系列进行重新分类,因为第 1-8 列是字符并且应该是数字,第 9-10 列是字符,因为它们应该是......

# data
x <- structure(c(NA, NA, "41.95", "30.55", "29.05", "23.71", NA, "23.80", 
NA, NA, "18.67", NA, "16.90", "17.10", "14.90", "13.64", "12.70", 
"11.65", "10.75", " 9.75", " 9.05", " 7.95", " 6.70", " 6.02", 
" 5.05", NA, NA, " 0.00", " 0.00", " 0.28", "-0.29", NA, " 0.00", 
NA, NA, "-1.28", NA, "-1.10", " 0.00", "-0.30", "-1.51", "-1.50", 
"-2.66", "-1.50", "-1.45", "-1.15", "-0.45", "-0.75", "-1.38", 
"-0.45", "48.20", "43.20", "38.20", "33.20", "28.25", "23.30", 
"22.25", "21.25", "20.30", "19.35", "18.35", "17.40", "16.35", 
"15.50", "14.50", "13.55", "12.55", "11.55", "10.60", " 9.65", 
" 8.65", " 7.70", " 6.80", " 5.90", " 5.00", "48.80", "43.80", 
"38.80", "33.80", "28.65", "23.65", "22.80", "21.65", "20.65", 
"19.65", "18.65", "17.70", "16.70", "15.65", "14.70", "13.70", 
"12.65", "11.75", "10.75", " 9.80", " 8.80", " 7.85", " 6.95", 
" 6.00", " 5.10", "     0", "     0", "    21", "    27", "     0", 
"   356", "     0", "    82", "     0", "     0", "   323", "     0", 
"   444", "   242", "   223", "  1304", "   362", "   263", "   126", 
"   690", "  1445", "   624", "   476", "   995", "   730", NA, 
NA, NA, NA, "   71", "  131", NA, NA, NA, NA, "  435", NA, "   42", 
NA, "  171", "  423", "   83", "   39", "   20", "    6", "  124", 
"   42", "  177", "  425", "  344", " 65.00", " 70.00", " 75.00", 
" 80.00", " 85.00", " 90.00", " 91.00", " 92.00", " 93.00", " 94.00", 
" 95.00", " 96.00", " 97.00", " 98.00", " 99.00", "100.00", "101.00", 
"102.00", "103.00", "104.00", "105.00", "106.00", "107.00", "108.00", 
"109.00", NA, NA, "  0.00", "  0.00", "  0.97", " -1.21", NA, 
"  0.00", NA, NA, " -6.42", NA, " -6.11", "  0.00", " -1.97", 
" -9.97", "-10.56", "-18.59", "-12.24", "-12.95", "-11.27", " -5.36", 
"-10.07", "-18.65", " -8.18", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", "Sep 25, 2015", 
"Sep 25, 2015", "Sep 25, 2015"), class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", index = structure(c(1442534400, 
1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 
1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 
1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 
1442534400, 1442534400, 1442534400, 1442534400, 1442534400, 1442534400
), tzone = "UTC", tclass = "Date"), .Dim = c(25L, 10L), .Dimnames = list(
    NULL, c("p", "c", "b", "a", "oi", "vol", "strike", "cp", 
    "callput", "expiry")))

我所做的是使用以下方法将第 1-8 列变成数字:

xx <- reclass(apply(x[,1:8], 2, as.numeric), x)

但是当我尝试将它与 x 中的最后两个字符列组合时,称为 expirycallput 它会将字符列变成 NA

xy <- merge.xts(xx, x[,9:10])

我该如何解决这个问题?

xts是表面之下的matrix,所以它必须全是数字,或者全是字符。对于财务应用程序,它通常必须是数字,所以问题就变成了如何处理字符列。

如果字符数据列只能是几个可能值之一,那么您实际上有一个因素。您的 call/put 列适合这个:

as.numeric( factor( c("C","C","P"), levels=c("C","P" ) ) )  #1 1 2

显然,您需要提前知道您所有的因素水平。

如果字符列实际上是日期戳,例如您的期权到期列,那么有两种方法可以将其转换为数字。一种是直接使用as.numeric

as.numeric(as.Date("Sep 25, 2015", "%b %d, %Y"))  #16699

另一个是 8 位 YYYYMMDD 数字:

as.numeric(format(as.Date("Sep 25, 2015", "%b %d, %Y"), "%Y%m%d"))  #20150921

我更喜欢后者,因为它更具可读性。 (但是前者如果你想直接在上面做日期运算的话。)

时间戳和一天中的时间可以用同样的方式处理。

如果你的字符串不符合上述情况,选择就不太合胃口了:

  • 使用 data.frame。 (rownames 中的日期戳;您仍然可以 rbind 新行;subset 将感兴趣的列放入 xts 对象中,当您需要时)
  • 使用并行 xts 对象(难闻的代码味道)。
  • xts 对象的一个​​属性。 (你可以在一个 xts 对象上有一个属性,它是一个 xts 对象。当字符串仅用于主 xts 对象中的日期戳的子集时,我使用了这个。)
  • 等待允许写入混合类型的xts class。 :-)