首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-获取包含数据帧的指定百分位数级别的汇总表

R-获取包含数据帧的指定百分位数级别的汇总表
EN

Stack Overflow用户
提问于 2020-08-30 01:17:32
回答 2查看 125关注 0票数 0

我希望获得一个汇总表,它显示的不是R中summary(x)函数生成的典型描述性统计数据。例如,10%百分位数、90%百分位数。我在网上找到的其他答案推荐了给出答案的方法,但不是以表格的形式。

我一直在寻找一种方法,只需在summary(x)函数生成的汇总表中添加指定的百分位数级别。

以下是示例数据:

代码语言:javascript
复制
df = data.frame("a"=seq(1,10), "b"=seq(10,100,10),
                "c"=letters[seq(1,10)], "d"=seq(5,95,10))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-30 01:17:32

代码语言:javascript
复制
# generate data
df = data.frame("a"=seq(1,10), "b"=seq(10,100,10), "c"=letters[seq(1,10)], "d"=seq(5,95,10))

# filter numerical columns
ndf = Filter(is.numeric,df)
features = colnames(ndf)

# percentiles reqd
p_reqd = c(0,0.10,0.25,0.5,0.75,0.90,0.95,1)   # more percentile levels can be specified here
                                               # after adding/removing, adjust p_lev as well

# labels for specified percentiles + mean
p_lev = c('Min','10%','25%','50%','Mean','75%','90%','95%','Max')

# created empty dataframe with row names specified
final = data.frame(row.names = p_lev)

# loop
for (i in features) {
  x = ndf[,i]
  sm = data.frame("dStats" = quantile(x, p_reqd))
  final[1:which(rownames(final)=="50%"),i] = sm$dStats[1:which(rownames(sm)=="50%")]
  final[which(rownames(final)=="50%")+1,i] = round(mean(x),2)
  final[(which(rownames(final)=="50%")+2):nrow(final), i] = 
    sm$dStats[(which(rownames(sm)=="50%")+1):nrow(sm)]  
}

# custom summary table
final

票数 0
EN

Stack Overflow用户

发布于 2020-08-30 01:30:24

还有一种dplyrtidyr方法可以做到这一点。

代码语言:javascript
复制
df = data.frame("a"=seq(1,10), "b"=seq(10,100,10),
                "c"=letters[seq(1,10)], "d"=seq(5,95,10))
library(dplyr)
library(tidyr)
out <- df %>% summarise_if(is.numeric, .funs = list(
  "Min" = min, 
  "10%" = function(x)quantile(x, .1), 
  "25%" = function(x)quantile(x, .25), 
  "50%" = median, 
  "Mean" = mean, 
  "75%" = function(x)quantile(x, .75), 
  "90%" = function(x)quantile(x, .90), 
  "Max" = max)) %>% 
pivot_longer(cols=everything(), 
             names_pattern = "(.*)_(.*)", 
             names_to = c("var", "stat"), 
             values_to="vals") %>% 
  pivot_wider(names_from="var", 
              values_from="vals",
              id_cols="stat") %>% 
  as.data.frame()

rownames(out) <- out$stat
out <- out %>% select(-stat)
out
#          a     b    d
# Min   1.00  10.0  5.0
# 10%   1.90  19.0 14.0
# 25%   3.25  32.5 27.5
# 50%   5.50  55.0 50.0
# Mean  5.50  55.0 50.0
# 75%   7.75  77.5 72.5
# 90%   9.10  91.0 86.0
# Max  10.00 100.0 95.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63649799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档