在列表的列中排名

时间:2016-11-03 14:23:43

标签: r list rank

我有一个包含各种符号的列表,我想为其创建一个列,并相对于列表的其余部分对某个列进行排名。

例如,我有一个列表x,其中包含SPYIWM的时间序列。对于每个列表项,我计算rsi。然后,我想在每个列表中创建一个新列,为rsiSPY之间的最低IWM值分配一个等级。

我总是得到1的等级,这是不正确的,所以在我的代码中必须出错。正如我所说,我需要等级rsi

library(quantmod)

stockData <- new.env() 

symbols = c("IWM","SPY")
getSymbols(symbols, src='yahoo',from = "2016-10-01",to = Sys.Date())


x <- list() 
for (i in 1:length(symbols)) {
  x[[i]] <- get(symbols[i], pos=stockData)  # get data from stockData environment 
  x[[i]]$rsi <-RSI(Cl(x[[i]]),14)
  x[[i]]$rank <- NA
  x[[i]]$rank<-apply(-x[[i]]$rsi,1,rank)
}

1 个答案:

答案 0 :(得分:0)

library(quantmod)
stockData <- new.env() 

symbols = c("IWM","SPY")
getSymbols(symbols, src='yahoo',from = "2016-10-01",to = Sys.Date())

fulldata <- lapply(symbols, get, pos = stockData)
closedata <- lapply(fulldata, Cl)
rsi <- lapply(closedata, RSI, n = 14) # or e.g. n = 2, if RSI based on two periods  

为了稍后使用排名,我们需要将数据转换为data.frame,因为rank()不喜欢RSI()给出的输出类。

rsi <- lapply(rsi, as.data.frame)

RSI()取决于14个时段的移动平均线,导致前14个时段的结果为NA,因为无法为它们计算移动平均线。

在进行排名时,有两个选项可以处理NA - 值。您认为最合适的选项取决于您将在以后使用数据的内容:

  • 您可以选择将NA中的所有rsi - 值替换为零以进行排名:

    for(i in 1:length(rsi)){
        rsi[[i]][is.na(rsi[[i]])] <- 0
        }
    ranks <- lapply(rsi, rank)
    
  • 您可以忽略所有NA - 值,只需在排名

    之前删除它们
     ranks <- lapply(rsi, rank, na.last = NA)
    
  • NA - 值排名为最低或最高等级。

    # If NA be put last, use "na.last = TRUE".
    # If NA be put first, use "na.last = FALSE"
    ranks <- lapply(rsi, rank, na.last = TRUE)  
    

给定日期的符号中的 >

我会将列表合并到一个数据框中,然后计算逐行排名:

rsiDF <- data.frame(rsi)
rsiDF <- cbind(rsiDF, t(apply(rsiDF, 1, rank)))

请注意,您可以在此处再次决定如何处理排名值和NA - 排名计算中的值(如上所述和?rank中所述)

如果您希望再次将其重新打入列表:

k <- length(symbols)
interranks <- list()
for(i in 1:k){
   interranks[[i]] <- rsiDF[,c(i, i+k)]
}