2016-11-15 1 views
0

У меня есть dataframe строится так:Как рассчитать процентные доходы в кадре данных с несколькими ценными бумагами?

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 

Так по существу just (Цена (текущая)/Цена (время -1)) -1 для каждого столбца, с первой строкой для каждого тикера как NA

Глядя немного в tapply(), я по-прежнему не уверен, как рассчитать разница, поскольку я имею в виду одну и ту же колоду млн. Есть ли советы о том, как это сделать? Я бы признателен за помощь

+0

'DF $ RET <- unlist (tapply (DF $ Цена, $ DF SecTicker, функция (х) с (Н. А., х [-1]/х [-длина (х)] - 1))) ', если вы хотите использовать' tapply'. – JasonWang

+0

:)! благодаря! Компонент 'x [-1]/x [-length (x)]' является гениальным – Lillian

ответ

0

преобразовать его в data.frame, возьмите lag из «Цены 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 класс, после преобразования в data.table, изменить класс «Цена», чтобы numeric перед созданием «RET»

Если это data.frame, то

setDT(df1)[, ret := round((Price/shift(Price))-1, 2), by = SecTicker][] 
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 в качестве имени и в каждом элементе списка является да ta, содержащий значения Price и ret. Вы можете вернуть формат data.frame.

finaldata <- do.call(function(...) rbind(..., make.row.names = FALSE), newdata) 
finaldata[["SecTicker"]] <- rep(names(newdata), 
           vapply(newdata, nrow, numeric(1)))