2016-08-30 6 views
1

Я пытаюсь добавить столбец после того, как я преобразовал xts в dataframe, поскольку xts могут включать только числовые значения. Дополнительный Я хочу связать их по строке в качестве конечного результата, но я терпеть неудачу и не нахожу решение. Вот мой код, который собирается от разных авторов в stackoverflow. Благодаря этому!Добавить столбец с тикером после преобразования зоопарка в dataframe

library(quantmod) 

# Fetch all Symbols from AMEX 
symbols <- stockSymbols(exchange = c("AMEX")) 
symbols <- symbols[,1] 

# define environment 
data <- new.env() 

# Load Stock data in environment 
getSymbols(symbols,from="2016-01-01", env=data) 

# build function to convert zoo to dataframe 
zoo.to.data.frame <- function(x, index.name="Date") { 
    stopifnot(is.zoo(x)) 
    xn <- if(is.null(dim(x))) deparse(substitute(x)) else colnames(x) 
    setNames(data.frame(index(x), x, row.names=NULL), c(index.name,xn)) 
} 

# build function to calculate different signals (...only price and ADX in this example) 
"SignalCalculator" <- function(x) { 
     # Adjusted Price 
     price <- x[,c(6)] 

     # ADX 
     adx <- ADX(x[,c("High","Low","Close")], n =14) 
     DIp <- adx$DIp 
     DIn <- adx$DIn 
     Adx <- adx$ADX 

     # bind single values together and convert to dataframe 
     result <- zoo.to.data.frame(cbind(price, DIp, DIn, Adx)) 
     # the following is not working respectively I don´t know how to 
     # result2 <- cbind(result, Ticker = x) 
} 

# Loop function on data # 
lapply(data,FUN = SignalCalculator) 

То, что я хотел бы сделать после того, как функция применяется ко всем линеечке, чтобы сформировать один огромный dataframe с рядом связывается со всем тикером внутри, чтобы экспортировать их в файл CSV. Это должно выглядеть следующим образом. Но для меня непонятно, как связать их вместе? Я ценю любую помощь по этой теме. Благодарю.

Table with stock data

ответ

0

out2 ниже в формате таблицы в ссылке вы предоставили. Вы можете использовать вспомогательные функции от xts, например HLC и Ad, которые более гибкие, чем жесткое кодирование ваших вариантов столбцов, и вам не нужно делать это zoo.to.data.frame.

# define environment 
data <- new.env() 

# Load Stock data in environment 
getSymbols(symbols,from="2016-01-01", env=data) 

SignalCalculator2 <- function(x) { 
    # Assumes first colname format is still [tickername].Open 
    tickername <- strsplit(colnames(x)[1], "\\.")[[1]][1] 
    # Adjusted Price: 
    price <- Ad(x) 
    colnames(price) <- "Price" 
    adx <- ADX(HLC(x), n = 14) 
    # You dont want this column in your table: 
    adx$DX <- NULL 
    res <- merge(price, adx) 
    # res is an xts object. Now convert to data.frame 
    df_res <- data.frame("Date" = index(res), "Ticker" = tickername, coredata(res)) 
    df_res 
} 

# data is an environment, not a list, so can use eapply (similar to lapply): 
out <- eapply(env = data, FUN = SignalCalculator2) 
out2 <- do.call(rbind, out) 
# If you want to order rows by date: 
out2 <- out2[order(out2$Date),] 
# Optional tidy up: 
rownames(out2) <- NULL 


> tail(out2) 
# Date Ticker Price  DIp  DIn  ADX 
# 164 2016-08-25 AAMC 12.72 17.67766 21.28021 11.31483 
# 330 2016-08-25 AAU 1.42 22.36896 23.64023 30.50243 
# 165 2016-08-26 AAMC 12.80 16.48608 21.07136 11.37868 
# 331 2016-08-26 AAU 1.36 23.02102 21.80518 28.51742 
# 166 2016-08-29 AAMC 13.15 15.75814 20.14096 11.43797 
# 332 2016-08-29 AAU 1.43 21.63012 22.30030 26.58943 
+0

Отлично! Вот как это должно выглядеть. Спасибо за упрощение моего кода! Только один вопрос. Можно ли выбрать только последнюю дату для каждого тикера? – Sven

+0

Конечно. Предполагая, что последняя дата может отличаться для каждого тикера, простой подход: 'library (data.table); dt_out <- as.data.table (out2); dt_out [Date == max (Date), SD, by = list (Ticker)]; ' – FXQuantTrader

+0

Ok. Это выглядит хорошо. Когда я запускаю код, он показывает мне результаты, как это должно быть в консоли. Но когда я запускаю 'View (dt_out)' я получаю все даты, как раньше? – Sven