我有一个数据(让我们称之为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
Run Code Online (Sandbox Code Playgroud)
我想计算minAsk-maxBid,在这种情况下= 1.6067-1.6066.我想为我的整个数据做这件事.我在想使用"by",但即使使用这个简单的代码:
by(mydata,mydata$datetime, min(mydata$price))
Run Code Online (Sandbox Code Playgroud)
为了找到每个块中的最低价格我得到以下错误:FUN中的错误(X [[1L]],...):找不到功能"FUN"
知道如何实现吗?我应该使用不同的功能ddply吗?
您提供了by错误的所需输入。你需要类似的东西:
by(mydata,mydata$datetime, function(x) min(x$price) )
#mydata$datetime: 2008/01/28,09:11:28.000
#[1] 1.6062
Run Code Online (Sandbox Code Playgroud)
看?by- 最基本的by需要输入......
by(data, INDICES, FUN)
Run Code Online (Sandbox Code Playgroud)
该函数FUN应用于指定为 的 data.frame 的整个子集data。即,如果您使用identityasFUN函数,INDICES则将返回由 定义的每个子集。尝试:
by(mydata,mydata$datetime, identity )
Run Code Online (Sandbox Code Playgroud)
因此,您不能直接询问min(mydata$price),您需要询问子min集中price变量的 。您可以将我原来的答案写为...
by(mydata,mydata$datetime, function(subdataset) min(subdataset$price) )
Run Code Online (Sandbox Code Playgroud)
要将其扩展到您的完整问题,您可以执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1563 次 |
| 最近记录: |