我正在尝试重新编写以下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
和expiry
的{{1}}中的最后两个字符列组合时,会将字符列转换为callput
NA
我该如何解决这个问题?
答案 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对象中的日期戳的子集时,我已使用此属性。)