merge.xts不使用R

时间:2015-09-21 00:11:32

标签: r merge character numeric xts

我正在尝试重新编写以下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)

但是当我尝试将其与名为xexpiry的{​​{1}}中的最后两个字符列组合时,会将字符列转换为callput

NA

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

xts是表面下方的matrix,因此它必须全部为数字或全部字符。对于财务应用程序,它通常必须是数字,因此问题变成如何处理字符列。

如果一个字符数据列只能是几个可能的值中的一个,那么你实际上有一个因子。您的看涨/看跌期权栏符合以下条件:

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类。 : - )