如何以矢量化方式处理所有子集

时间:2014-09-28 21:48:12

标签: r vectorization

我有一个包含大量符号的股票价格数据框,我想以矢量化方式对每个符号的子集执行操作。我的数据是:

 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上非常慢,如果我有太多符号,它可能会成为一个问题)

1 个答案:

答案 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]