R观测值非零子集的数据框的百分位数

时间:2019-02-13 04:11:39

标签: r quantile tibble

我想计算以下小标题的百分位数...

我在3个变量中的每一个中都有10个观察值的非零子集,即...

n <- 10
tibb <- tibble(
  x = 1:5, 
  y = 1, 
  z = x ^ 2 + y)

(排除的观测值全为零)

因此,平均值是字段/ 10(而不是/ 5)的总和:

meantibb  <-  tibb %>% group_by() %>% 
  summarise_if(is.numeric,  sum, na.rm = TRUE) / n
meantibb

如何在小标题中获得以下x,y和z的百分位数?

perciles <- c(0.5, 0.75)
percentiles <- function(p) quantile(p, perciles)

谢谢

2 个答案:

答案 0 :(得分:1)

您接近了,如果先使用“收集”然后再按三个不同的因素对数据进行分组,则创建均值(然后是百分位数)的方法可能会更简单。

library(dplyr)
n <- 10
tibb <- tibble(x = 1:5, y = 1, z = x ^ 2 + y)
tibb %>% 
  gather("fctr", "value") %>% 
  group_by(fctr) %>% 
  summarise(mean = sum(value) / n,
            perc_50 = quantile(value, 0.5),
            perc_75 = quantile(value, 0.75))

但是,我不确定您是否要获取非零子集或整个数据集的百分位数,因为这将改变您的结果,即

> x = 1:5
> quantile(x, 0.1)
10% 
1.4 

> test <- c(0,0,0,0,0,1,2,3,4,5)
> quantile(test, 0.1)  
10% 
  0 

答案 1 :(得分:1)

您可以创建一个包含零的数据集

missingRowCount <- n -  nrow(tibb)
colCount <- ncol(tibb)
zeroTibb <- matrix(rep(0, missingRowCount * colCount), ncol = colCount, nrow = missingRowCount) %>% as.tibble()
colnames(zeroTibb) <- colnames(tibb)
allTibb <- dplyr::bind_rows(tibb, zeroTibb)

一旦您拥有了完整的数据,就可以运行以下命令以获得小数位数

percTibble = sapply(allTibb, percentiles) %>%
  as.tibble()

这里的假设是,当包含零时,数据不会太大。