R语言 统计描述 分组统计(各种小方案)

可以直接复制到R运行
#加载包
library(tidyverse)
#创建一系列数据
data=data.frame(
  row.names = c('QWE','TYE','WUN','EJN','JDB',
                'wuy','okf','Aqe','Bdf','wty') ,
  Chinese = c(50, 60, 64, 55, 59,
              54, 61, 63, 64, 66 ),
  Math =  c(72, 68, NA, 29, NA,   #这里故意设置了缺失值
            45, 76, 74, 76, 75 ),
  gender = c(1, 2, 1, 2, 2, 2,1,1,2,1),  #1=男  2=女
  smoke = c('y','n','y','y','y','n','n','y','n','y'),
  bmi = c('正常','低体重','正常','超重','肥胖',
          '低体重','超重','正常','低体重','正常')
)
#自定义function内容
describe<-function(x,na.omit=TRUE){     #na.omit=TRUE不忽略缺失值
  if (na.omit)
    Miss<-sum(is.na(x)==TRUE)    #统计缺失值个数
  x<-x[!is.na(x)]                #去掉缺失值,下面的都是去掉NA计算的
  m<-mean(x)
  n<-length(x)                   #全部数据(已经去掉缺失值的)
  s<-sd(x)
  skew<-sum((x-m)^3/s^3)/n
  kurt<-sum((x-m)^4/s^4)/n-3
  Normal_ks=ks.test(x,"pnorm")[["p.value"]]
  #Noraml_sh=shapiro.test(x)[["p.value"]]    #把#号去掉可用
  return(round(c(n=n,Miss=Miss,mean=m,stdev=s,
                 skew=skew,kurtosis=kurt,
                 Normal_ks=Normal_ks
                 #Noraml_sh=Noraml_sh       #把#号去掉可以用
                 ),3))
}
#第一种分组统计法
b1 <- data    %>%
  filter(gender==1)  %>%
  select(Chinese,Math) %>%
  sapply(describe)
b2 <- data    %>%
  filter(gender==2)  %>%
  select(Chinese,Math) %>%
  sapply(describe)
cbind(b1,b2)  %>% print()
#第二种分组统计
describe_by<-function(x,na.omit=TRUE)sapply(x,describe,na.omit=TRUE)
a=by(data[,c('Chinese','Math')],data$gender,describe_by)
a
cbind(a[["1"]],a[["2"]])
#第三种方式
describe_by<-function(x,na.omit=TRUE)sapply(x,describe,na.omit=TRUE)
myvars <- c('Chinese','Math')
by(data[myvars], 
   list(xingbie=data$gender,
        xiyan=data$smoke), 
   FUN=describe_by)
#一些说明
# ties should not be present for the Kolmogorov-Smirnov test
#样本数据中存在有相同的值,单样本K-S检验要求检验分布是连续的,
#而连续分布出现相同值的概率为0.如果是出现相同的,则连续分布的假设不成立,
#则该方法无法使用

#第四种
library(Hmisc)    #在Hmisc包,需要预加载
describe(data$age) 
describe(data[data$nq101==1,]$age) #分组统计

#第五种 描述百分位数的
quantile(data[data$nq101==1, ]$age, p = c(0.05,0.25, 0.5, 0.75)) #分组统计
quantile(data$age, p = c(0.05,0.25, 0.5, 0.75))

#第六种 map函数
library(purrr)
map(data[data$group=="case",1:2],mean)

#第七种
#aggregate分类汇总函数
aggregate(x=list(), #进行分类的数据
          by=list(),#进行分类的数据条件,也就是分组
          FUN=
          )

fenlei1 <- aggregate(x=list(Q=data$Sepal.Length), #进行分类的数据  Q是行名
          by=list(group=data$Species),#进行分类的数据条件,也就是分组 
          FUN=mean,    #length mean sd 
)
fenlei1


#其他
summary(data[data$Species=='virginica',]$Sepal.Length)
mean(data[data$Species=='virginica',]$Sepal.Length)
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值