我有一个数据(让我们称之为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
吗?
答案 0 :(得分:4)
尝试
by(mydata,mydata$datetime, function(d)with(d, min(price[side==1])-max(price[side==0])))
答案 1 :(得分: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
的data.frame的整个子集。即如果您使用identity
作为FUN
函数,则会返回INDICES
定义的每个子集。试试:
by(mydata,mydata$datetime, identity )
因此,您不能直接询问min(mydata$price)
,而是需要在子集中询问min
变量的price
。你可以将我的原始答案写成... ...
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