0

xts 对象 xts_IndData3 包含一个 PositionSize 属性,该属性记录金融工具中的头寸大小和其他两个属性。NewEntrySize >= 0。NewExitSize <= 0。我将下面的代码放在一起以避免我在其他地方讨论过的 xts 错误。我试图避免的错误与在同一个表达式中引用两个不同的 xts rowID 有关。我仍然无法让下面的代码工作。提前感谢您的帮助。

已编辑...我将 xts 对象转换为数据框。这是问题的数据和新代码,可以更清楚地完成我需要完成的工作。

> str(TestData)
'data.frame':   12 obs. of  5 variables:
 $ DateTime                 : Date, format: "2012-07-27" "2012-07-27" "2012-07-27" ...
 $ NewEntrySize             : int  0 0 0 1 0 0 0 0 0 0 0 0...
 $ NewExitSize              : int  0 0 0 0 0 0 0 0 0 -1 0 0...
 $ PositionSize             : int  0 0 0 1 0 0 0 0 0 -1 0 0...
 $ DesiredResultPositionSize: int  0 0 0 1 1 1 1 1 1 0 0 0...
>    
>    PositionSizeLag <- 0
>    PositionSizeLag <- as.integer( PositionSizeLag )
>    TestData$PositionSize <- as.integer( TestData$PositionSize )
>    TestData$NewEntrySize <- as.integer( TestData$NewEntrySize )
>    TestData$NewExitSize  <- as.integer( TestData$NewExitSize  )
>    for (i in 1 : nrow( TestData )) {
+       TestData[i]$PositionSize <- PositionSizeLag              +
+                                    TestData[i]$NewEntrySize +
+                                    TestData[i]$NewExitSize
+       PositionSizeLag <- TestData[i]$PositionSize
+    }
Error in `$<-.data.frame`(`*tmp*`, "PositionSize", value = numeric(0)) : 
  replacement has 0 rows, data has 12
> 

我将数据框转换为 xts 对象。这是对象的 xts 版本上的 dput(head(xts_TestData)) 的输出。

> dput(head(xts_TestData))
structure(c("2012-07-27", "2012-07-27", "2012-07-27", "2012-07-27", 
"2012-07-27", "2012-07-27", "0", "0", "0", "1", "0", "0", "0", 
"0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", 
"0", "1", "1", "1"), class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", index = structure(c(1343347200, 
1343347200, 1343347200, 1343347200, 1343347200, 1343347200), tzone = "UTC", tclass = "Date"), .Dim = c(6L, 
5L), .Dimnames = list(NULL, c("DateTime", "NewEntrySize", "NewExitSize", 
"PositionSize", "DesiredResultPositionSize")))
> 
4

1 回答 1

1

您不能像在 data.frame 中那样在 xts 对象中混合类型,因此您的所有as.integer调用都不会更改 xts 对象。也不需要DateTime在 xts 对象中有列,因为这是由index属性决定的。

[由于 和 的奇怪组合,您在下面的代码中遇到错误$。最好先按列(使用$),然后按行(使用[)进行子集化。

PositionSizeLag <- 0
for (i in 1 : nrow( xts_TestData )) {
   xts_TestData$PositionSize[i] <- PositionSizeLag +
       xts_TestData$NewEntrySize[i] + xts_TestData$NewExitSize[i]
   PositionSizeLag <- xts_TestData$PositionSize[i]
}

您问题中代码中的错误(使用data.frame)是因为TestData[i]返回data.frame的一,并且对data.frame进行子集化$也返回一列。如果你想返回一行data.frame,你需要TestData[i,](注意逗号)。

于 2013-08-16T13:52:41.443 回答