计算具有正数和负数的列中的四分位数(仅正数)的功能

时间:2019-01-24 14:31:22

标签: r function quantmod quantile

我想在显示差距的列中计算数字的第一四分位数。在此列中,既有正数也有负数,因此我只想过滤出正数并计算四分位数(第1个),但是该函数存在问题(请参见下面的代码)

#我尝试使用“> 0”和“ 0.25”的函数来获得第一个四分位数,但不知何故失败了,我不知道为什么。

library(quantmod)

Symbols <- c("FB","AAPL","AMZN","NFLX","GOOG")

getSymbols(Symbols,from="2018-06-01")

stock_data = sapply(.GlobalEnv, is.xts)

all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))

# Calculate gap

Gap_function <- function(x) {
stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
stock_name <- paste0(stock_name, ".Gap")
column_names <- c(names(x), stock_name)
x$rgap <- quantmod::Op(x) - lag(quantmod::Cl(x)) 
x <- setNames(x, column_names)
return(x)
}

all_stocks <- lapply(all_stocks, Gap_function)

# Calculate  1st Quantile of positive numbers in .GAP column,  currently it is not working.
# I don't know how to indicate to use only positive numbers (>0) and  (1st quartile 0.25)

Quartile1_function <- function(x) { 
stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
stock_name <- paste0(stock_name, ".GapQ1")
column_names <- c(names(x), stock_name)
x$quartile1 <- (quantile(x,na.rm=TRUE [,grep(".Gap" >0,      colnames(x))], 0.25))
x <- setNames(x, column_names)
return(x)
}

all_stocks <- lapply(all_stocks, Quartile1_function)


#The desired result is to get a 1st quartile of .Gap column  (taking   only positive numbers) in a new column =(7.609986)

#If you run this code you will get AMZN quartiles only for positive     numbers in the .Gap column. but I don't know what is failing to get a function to do this for all stocks.

quantile(all_stocks$AMZN$AMZN.Gap[which(all_stocks$AMZN$AMZN.Gap >0)])

       0%       25%       50%       75%      100% 
 0.060059  7.609986 11.709961 21.319946 88.640015 

2 个答案:

答案 0 :(得分:1)

像这样吗?

x <- c(-10,-5,-7,0:10)
quantile(x[x>=0],0.25)
# 25% 
# 2.5 

答案 1 :(得分:1)

我认为您想要以下类似内容。这将返回xxx.GapQ1中的数据,其中的数字为正,并将它们分为NA 1、2、3和4。NA为0(和0)以下的数字。您可以稍后过滤掉不需要的内容。

Quartile1_function <- function(x) { 
  stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
  stock_name <- paste0(stock_name, ".GapQ1")
  column_names <- c(names(x), stock_name)

  # use this grep the column name of interest and plug that in the next section.
  column_of_interest <- grep(".Gap", colnames(x))

  # Find the quantiles based only on positive numbers. 
  # The negative numbers or 0 will be returned as NA 
  x$quartile1 <- as.integer(cut(x[, column_of_interest],
                                quantile(x[x[, column_of_interest] > 0, column_of_interest], na.rm = TRUE),
                                include.lowest = TRUE))

  names(x) <- column_names
  return(x)
}

all_stocks <- lapply(all_stocks, Quartile1_function)
head(all_stocks$AMZN)

           AMZN.Open AMZN.High AMZN.Low AMZN.Close AMZN.Volume AMZN.Adjusted  AMZN.Gap AMZN.GapQ1
2018-06-01   1637.03   1646.73  1635.09    1641.54     3313400       1641.54        NA         NA
2018-06-04   1648.90   1665.68  1645.49    1665.27     3187700       1665.27  7.359985          1
2018-06-05   1672.99   1699.00  1670.06    1696.35     4782200       1696.35  7.719970          2
2018-06-06   1704.51   1714.50  1686.47    1695.75     5473200       1695.75  8.160034          2
2018-06-07   1698.56   1699.90  1676.11    1689.30     3765700       1689.30  2.810059          1
2018-06-08   1681.12   1689.44  1673.01    1683.99     2955100       1683.99 -8.180054         NA