我的数据框构造如下:
SecTicker Price
[1] X 10
[2] X 12
[3] X 11
[4] Y 5
[5] Y 8
[6] Y 4
etc...
我想插入一个每天都有安全性回报的列,所以有点像这样
SecTicker Price ret
[1] X 10 NA
[2] X 12 .2
[3] X 11 -.0833
[4] Y 5 NA
[5] Y 8 .6
[6] Y 4 -.5
基本上只是(价格(当前)/价格(时间-1))-1每列,每个股票代码的第一行为NA
看一下tapply(),我仍然不确定如何计算差异,因为我指的是同一列。关于如何解决这个问题有什么建议吗?我很感激帮助
答案 0 :(得分:0)
将其转换为data.frame
,获取价格lag
的{{1}}(使用and divide it by 'Price' after grouping by 'SecTicker
)。
data.table
根据显示的示例,数据集似乎为library(data.table)
as.data.table(m1)[, Price := as.numeric(Price)
][, ret := round((Price/shift(Price))-1, 2), by = SecTicker][]
# SecTicker Price ret
#1: X 10 NA
#2: X 12 0.20
#3: X 11 -0.08
#4: Y 5 NA
#5: Y 8 0.60
#6: Y 4 -0.50
,但matrix
只能包含一个matrix
。由于有class
类列,转换为character
后,在创建'ret'之前将'Price'类更改为data.table
如果是numeric
,那么
data.frame
答案 1 :(得分:0)
对于基本R
解决方案,我将从by
函数
newdata <- by(origdata[["Price"]], INDICES = origdata["SecTicker"],
FUN = function(x) data.frame(Price = x, ret = x/c(NA, x[-(length(x))]) - 1))
这为您提供了一个名称为SecTicker
的列表,每个列表元素中都包含Price
和ret
值的数据框。您可以使用。{/ p>重新获得data.frame
格式
finaldata <- do.call(function(...) rbind(..., make.row.names = FALSE), newdata)
finaldata[["SecTicker"]] <- rep(names(newdata),
vapply(newdata, nrow, numeric(1)))