我有一个包含大量符号的股票价格数据框,我想以矢量化方式对每个符号的子集执行操作。我的数据是:
head(dataset)
date open high low close volume symbol
1 2014-08-29 34.59 34.6800 34.59 34.6800 200 AAIT
2 2014-08-28 34.96 34.9600 34.96 34.9600 211 AAIT
3 2014-08-27 35.28 35.2800 35.28 35.2800 507 AAIT
4 2014-08-26 35.02 35.0200 35.02 35.0200 00 AAIT
5 2014-08-25 34.57 35.0200 34.57 35.0200 385 AAIT
6 2014-08-22 34.80 34.8299 34.80 34.8299 802 AAIT
对于每个符号,我都想做类似的事情:
for (symb in unique(dataset$symbol){
dataset$night = with(subset(dataset, dataset$symbol == symb), open[-length(open)]-close[-1])
}
这会导致最后一行填充NA
,因此我无法在整个数据帧上执行此操作。之后我可以替换最后一行,但我更愿意使用子集以获得更多便利。是否有可能以矢量化的方式进行for
循环(对于循环在r上非常慢,如果我有太多符号,它可能会成为一个问题)
答案 0 :(得分:2)
您可以使用dplyr
:
library(dplyr)
dataset <- dataset %>%
group_by(symbol) %>%
mutate(night = c(head(open, -1) - tail(close, -1), NA))
或plyr
:
library(plyr)
dataset <- ddply(dataset, .(symbol), mutate,
night = c(head(open, -1) - tail(close, -1), NA))
或data.table
:
library(data.table)
dt <- data.table(dataset)
setkey(dt, symbol)
dt[, night := c(head(open, -1) - tail(close, -1), NA), by = symbol]