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
中的最后两个字符列组合时,称为 expiry
和 callput
它会将字符列变成 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。 :-)
我正在尝试对以下 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
和 callput
它会将字符列变成 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。 :-)