R语言 数据分组汇总:求平均值、标准差、标准误

2024-06-08 1057阅读

Summarizing data 汇总数据

当你想按组对数据进行汇总(包括平均值、标准差等)

R语言 数据分组汇总:求平均值、标准差、标准误
(图片来源网络,侵删)

这里介绍的三种方法可以根据某些指定变量对数据进行分组

并对每组应用汇总函数(如平均值、标准差等):

1、函数 ddply() ,来自 plyr 包,最容易使用的

2、函数 summarizeBy() ,来自 doBy 包,比较容易使用

3、函数 aggregate() ,来自R base 包,较难使用

示例数据

不同性别受试者,服用阿斯匹林或安慰剂前后的观测值以及变化差值

由性别和条件的组合来分组:F-安慰剂、F-阿司匹林、M-安慰剂和 M-阿司匹林

并希望计算出每个组的:

1) N(个体数)

2) mean of change(变化均值)

3) standard deviation(标准差)

4) standard error of the mean (均值标准误差)

data  1   F   aspirin  5 -3.420000 0.8642916 0.3865230
#> 2   F   placebo 12 -2.058333 0.5247655 0.1514867
#> 3   M   aspirin  9 -5.411111 1.1307569 0.3769190
#> 4   M   placebo  4 -0.975000 0.7804913 0.3902456

处理丢失的数据:

如果数据中有 NA 值,就需要设定参数 na.rm=TRUE ;

length() 没有 na.rm 这个选项,因此只能 sum(!is.na(...)) 来计算有多少个非 NA 值

# 先放一点NA值进来
dataNA  2   F   placebo 12 -2.058333 0.5247655 0.1514867
#> 3   M   aspirin  7 -5.142857 1.0674848 0.4034713
#> 4   M   placebo  3 -1.300000 0.5291503 0.3055050

2、函数 summarizeBy()

library(doBy)
cdata    sex condition change.length change.mean change.sd
#> 1   F   aspirin             5   -3.420000 0.8642916
#> 2   F   placebo            12   -2.058333 0.5247655
#> 3   M   aspirin             9   -5.411111 1.1307569
#> 4   M   placebo             4   -0.975000 0.7804913
# 重命名 change.length 这一列为 N
names(cdata)[names(cdata)=="change.length"]  1   F   aspirin  5   -3.420000 0.8642916 0.3865230
#> 2   F   placebo 12   -2.058333 0.5247655 0.1514867
#> 3   M   aspirin  9   -5.411111 1.1307569 0.3769190
#> 4   M   placebo  4   -0.975000 0.7804913 0.3902456

处理丢失数据:

na.rm=TRUE 可以传递给 summaryBy() 调用的每个函数,除了 length()

# 写一个新版本的 length 让它可以识别 na.rm=T
length2  3   M   aspirin              7   -5.142857 1.0674848
#> 4   M   placebo              3   -1.300000 0.5291503

扩充:安排一步得出均值、计数、标准差、标准误和置信区间的函数summarySE

写函数:

## 对数据进行汇总
## 得到 计数, 均值, 标准差, 标准误 和 置信区间 (95%).
##   data: 数据框
##   measurevar: 需要进行汇总的列
##   groupvars: 提供分组的列
##   na.rm: 一个布尔值,决定是否忽略NA
##   conf.interval: 置信区间的百分比范围 (默认是 95%)
summarySE  1   F   aspirin  4 -3.425000 0.9979145 0.4989572 1.5879046
#> 2   F   placebo 12 -2.058333 0.5247655 0.1514867 0.3334201
#> 3   M   aspirin  7 -5.142857 1.0674848 0.4034713 0.9872588
#> 4   M   placebo  3 -1.300000 0.5291503 0.3055050 1.3144821

用NA填充空白组合:

有时,汇总数据框中会出现空的因子组合,即有可能出现的因素组合,但实际上并没有出现在原始数据框架中。

在汇总数据框中自动用 NA 填入这些组合通常很有用。

为此,在调用 ddply() 或 summarySE() 时设置 .drop=FALSE 。

用法示例:

# 首先把 男性+安慰剂 组合的数据删去
dataSub    sex condition  N    change        sd        se        ci
#> 1   F   aspirin  5 -3.420000 0.8642916 0.3865230 1.0731598
#> 2   F   placebo 12 -2.058333 0.5247655 0.1514867 0.3334201
#> 3   M   aspirin  9 -5.411111 1.1307569 0.3769190 0.8691767
# 设置 .drop=FALSE 不放弃这些组合
summarySE(dataSub, measurevar="change", groupvars=c("sex", "condition"), .drop=FALSE)
#> Warning in qt(conf.interval/2 + 0.5, datac$N - 1): NaNs produced
#>   sex condition  N    change        sd        se        ci
#> 1   F   aspirin  5 -3.420000 0.8642916 0.3865230 1.0731598
#> 2   F   placebo 12 -2.058333 0.5247655 0.1514867 0.3334201
#> 3   M   aspirin  9 -5.411111 1.1307569 0.3769190 0.8691767
#> 4   M   placebo  0       NaN        NA        NA        NA

用0填充空白组合:

原理同上,但改用0填充

写用0填充的函数:

fillMissingCombs  3   M   aspirin  9 -5.411111 1.1307569 0.3769190 0.8691767
#> 4   M   placebo  0  0.000000 0.0000000 0.0000000 0.0000000

3、使用R自带的aggregate()

缺点是步骤较为繁琐

优点是不用安装新的R包

# 统计每个类别(性别*条件)中的受试者人数
cdata    sex condition subject
#> 1   F   aspirin       5
#> 2   M   aspirin       9
#> 3   F   placebo      12
#> 4   M   placebo       4
# 重命名 "subject" 这一列为 "N"
names(cdata)[names(cdata)=="subject"]    sex condition  N
#> 1   F   aspirin  5
#> 2   M   aspirin  9
#> 3   F   placebo 12
#> 4   M   placebo  4
# 按 sex 排序
cdata    sex condition  N
#> 1   F   aspirin  5
#> 3   F   placebo 12
#> 2   M   aspirin  9
#> 4   M   placebo  4
# 同时保留 __before__ 和 __after__ 这两列:
# 按性别和条件获取平均效应大小
cdata.means    sex condition   before     after    change
#> 1   F   aspirin 11.06000  7.640000 -3.420000
#> 2   M   aspirin 11.26667  5.855556 -5.411111
#> 3   F   placebo 10.13333  8.075000 -2.058333
#> 4   M   placebo 11.47500 10.500000 -0.975000
# 合并数据框
cdata    sex condition  N   before     after    change
#> 1   F   aspirin  5 11.06000  7.640000 -3.420000
#> 2   F   placebo 12 10.13333  8.075000 -2.058333
#> 3   M   aspirin  9 11.26667  5.855556 -5.411111
#> 4   M   placebo  4 11.47500 10.500000 -0.975000
# 获取 "change"的样本 (n-1) 标准差
cdata.sd  1   F   aspirin 0.8642916
#> 2   M   aspirin 1.1307569
#> 3   F   placebo 0.5247655
#> 4   M   placebo 0.7804913
# 合并
cdata    sex condition  N   before     after    change change.sd
#> 1   F   aspirin  5 11.06000  7.640000 -3.420000 0.8642916
#> 2   F   placebo 12 10.13333  8.075000 -2.058333 0.5247655
#> 3   M   aspirin  9 11.26667  5.855556 -5.411111 1.1307569
#> 4   M   placebo  4 11.47500 10.500000 -0.975000 0.7804913
# 最后计算标准误
cdata$change.se    sex condition  N   before     after    change change.sd change.se
#> 1   F   aspirin  5 11.06000  7.640000 -3.420000 0.8642916 0.3865230
#> 2   F   placebo 12 10.13333  8.075000 -2.058333 0.5247655 0.1514867
#> 3   M   aspirin  9 11.26667  5.855556 -5.411111 1.1307569 0.3769190
#> 4   M   placebo  4 11.47500 10.500000 -0.975000 0.7804913 0.3902456

如果数据中有NA值并希望忽略它们,设置 na.rm=TRUE

cdata.means    sex condition   before     after    change
#> 1   F   aspirin 11.06000  7.640000 -3.420000
#> 2   M   aspirin 11.26667  5.855556 -5.411111
#> 3   F   placebo 10.13333  8.075000 -2.058333
#> 4   M   placebo 11.47500 10.500000 -0.975000
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]