我有一个数据表,其中包含日期,唯一的公司名称及其股票回报,看起来有点像这样:
require(data.table)
DATE <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
COMP <- c(replicate(60, "AAPL"), replicate(60, "INTL"), replicate(60, "GOOGL"), replicate(60, "MSFT"))
RET <- rnorm(240)
test1 <- data.table(DATE, COMP, RET)
现在我可以计算每个数据点之前平均6个相同月份的日历回报。所以例如对于1990年1月的AAPL股票回报,我希望Jan90回报旁边的新列中的Jan89,Jan 88,...和Jan84的回报均值。我试图习惯跳过行,但现在我有点卡住了。以下是我曾经使用过的机制代码:
test1$new1 <- test1$RET[seq.int(from = 1L, to = 20L, by = 6L)]
test1$new2 <- test1$RET[seq.int(from = -20L, to = 0L, by = 6L)]
n = 6
test1$new3 <- rowMeans(test1[seq(from = 1, to = nrow(test1), by = n),])
有没有人有想法,怎么做?
原因,为什么它与其他问题有所不同:这里的关键点是只考虑以前的值而只考虑某个公司。此外,它应该作为新列添加。
PS:我没有致力于数据表,到目前为止我只是很喜欢这个包。
答案 0 :(得分:0)
在重复的问题中调整接受的答案以使其成为一种功能是一个问题
然后,首先将输入数据集拆分为"COMP"
,计算均值并使用包bind_rows
中的函数dplyr
将所有内容组合回一个数据集。
library(dplyr)
fun <- function(DF, col = "RET", n = 6){
aggregate(DF[[col]], list(rep(1:(nrow(test1)%/%n + 1), each = n, len = nrow(DF))), mean)
}
sp <- split(test1, test1$COMP)
res <- lapply(sp, fun)
res <- bind_rows(res, .id = "id")