5

我有一个带有以下数据框的数据(我们称之为 mydata)。

datetime|side(0=Bid,1=Ask)| distance(1:best price, 2: 2nd best, etc.)| price
2008/01/28,09:11:28.000,0,1,1.6066
2008/01/28,09:11:28.000,0,2,1.6065
2008/01/28,09:11:28.000,0,3,1.6064
2008/01/28,09:11:28.000,0,4,1.6063
2008/01/28,09:11:28.000,0,5,1.6062

2008/01/28,09:11:28.000,1,1,1.6067
2008/01/28,09:11:28.000,1,2,1.6068
2008/01/28,09:11:28.000,1,3,1.6069
2008/01/28,09:11:28.000,1,4,1.6070
2008/01/28,09:11:28.000,1,5,1.6071

我想计算 minAsk-maxBid,在这种情况下 = 1.6067-1.6066。我想为我的整个数据执行此操作。我在考虑使用“by”,但即使使用这个简单的代码:

by(mydata,mydata$datetime, min(mydata$price)) 

为了在每个区块中找到最低价格,我收到以下错误:FUN(X[[1L]], ...) 中的错误:找不到函数“FUN”

知道如何实现吗?我应该使用不同的功能ddply吗?

4

2 回答 2

4

尝试

by(mydata,mydata$datetime, function(d)with(d, min(price[side==1])-max(price[side==0])))
于 2013-08-28T00:34:18.923 回答
3

您提供by了错误的所需输入。你需要类似的东西:

by(mydata,mydata$datetime, function(x) min(x$price) )
#mydata$datetime: 2008/01/28,09:11:28.000
#[1] 1.6062

?by- 最基本by的需要......

by(data, INDICES, FUN)

该函数FUN应用于指定为 的 data.frame 的整个子集data。即,如果您identity用作FUN函数,INDICES则将返回定义的每个子集。尝试:

by(mydata,mydata$datetime, identity )

因此,您不能只要求min(mydata$price)直接,您需要要求子集中minprice变量。你可以把我原来的答案写成...

by(mydata,mydata$datetime, function(subdataset) min(subdataset$price) )

要将其扩展到您的全部问题,您可以执行以下操作:

by(
  mydata,
  mydata$datetime,
  function(x) min(x$price[x$side==1]) - max(x$price[x$side==0]) 
)
#mydata$datetime: 2008/01/28,09:11:28.000
#[1] 1e-04

data.table为了将来参考,这在理论上与包使用其by=参数及其.SD(子数据)代码的操作方式非常相似。在data.table这种情况下,答案更简单:

mydt <- as.data.table(mydata)

mydt[,min(price[side==1]) - max(price[side==0]),by=datetime]
#                  datetime    V1
#1: 2008/01/28,09:11:28.000 1e-04

mydt[,list(minmax=min(price[side==1]) - max(price[side==0])),by=datetime]
#                  datetime minmax
#1: 2008/01/28,09:11:28.000  1e-04
于 2013-08-28T00:38:38.053 回答