R 基本函数sweep的使用(apply函数的利器)

本文介绍了R语言中的sweep函数,用于数据集的统计量操作,如均值中心化和标准化。通过示例展示了如何利用sweep函数对数据集的每一列进行减去均值的操作,同时也提到了可以使用apply函数获取统计量。此外,还展示了将统计量作为一个向量传入sweep函数的例子。sweep函数有效地避免了使用for循环,提高了代码效率。
摘要由CSDN通过智能技术生成

1、背景

最近,在进行数据集的标准化处理的时候,遇到了sweep函数。这是我使用R这么久第一次看到这个函数的使用。不得不感叹R的强大。
好了,不感叹了,学海无涯,继续奋斗吧!!!

  • sweep函数主要用于各种统计量的操作,该统计量通常来自于apply函数,这也是经常使用的统计量(比如按行求和,求均值,求中位值等)。

  • 对统计量的处理,比如,我们计算每一行/列减去均值(均值中心化),或者除以均值(均值标准化)等,sweep行数就发挥作者用了。

  • sweep函数有效的替代了for循环

接下来,我们来讨论一下其应用。

2、基本使用

2.1 语法

sweep(x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...)

参数:

  • x:即要处理的原数据集 - 向量或矩阵
  • MARGIN:对行(1)或列(2),或者数列的其他维度进行操作
  • STATS:需要对原数据集操作用到的统计量,一般来源于apply函数(我们常用的,也可以是向量,或者其他向量)
  • FUN:操作需要用到的四则运算,默认为减法"-",当然可以修改成"+","*","/"即加、乘、除
  • check.margin:是否需要检查维度是否适宜的问题,默认为TRUE。
  • ……:其他参数

2.2 使用示例

# 加载数据集
> require(stats)
> dat <- head(attitude, 10)
> head(dat)
# rating complaints privileges learning raises critical advance
# 1     43         51         30       39     61       92      45
# 2     63         64         51       54     63       73      47
# 3     71         70         68       69     76       86      48
# 4     61         63         45       47     54       84      35
# 5     81         78         56       66     71       83      47
# 6     43         55         49       44     54       49      34
  1. 每一列均减去对应列的均值
> colMeans(dat)
# rating complaints privileges   learning     raises   critical    advance 
# 63.0       66.6       50.8       54.4       64.8       76.4       40.4 
> sweep(x = dat, MARGIN = 2, STATS = colMeans(dat), FUN = "-")
# rating complaints privileges learning raises critical advance
# 1     -20      -15.6      -20.8    -15.4   -3.8     15.6     4.6
# 2       0       -2.6        0.2     -0.4   -1.8     -3.4     6.6
# 3       8        3.4       17.2     14.6   11.2      9.6     7.6
# 4      -2       -3.6       -5.8     -7.4  -10.8      7.6    -5.4
# 5      18       11.4        5.2     11.6    6.2      6.6     6.6
# 6     -20      -11.6       -1.8    -10.4  -10.8    -27.4    -6.4
# 7      -5        0.4       -8.8      1.6    1.2     -8.4    -5.4
# 8       8        8.4       -0.8      0.6    5.2    -10.4     0.6
# 9       9       15.4       21.2     12.6    6.2      6.6    -9.4
# 10      4       -5.6       -5.8     -7.4   -2.8      3.6     0.6

# 或者使用 apply 函数
> sweep(x = dat, MARGIN = 2, STATS = apply(dat, 2, mean), FUN = "-")
# rating complaints privileges learning raises critical advance
# 1     -20      -15.6      -20.8    -15.4   -3.8     15.6     4.6
# 2       0       -2.6        0.2     -0.4   -1.8     -3.4     6.6
# 3       8        3.4       17.2     14.6   11.2      9.6     7.6
# 4      -2       -3.6       -5.8     -7.4  -10.8      7.6    -5.4
# 5      18       11.4        5.2     11.6    6.2      6.6     6.6
# 6     -20      -11.6       -1.8    -10.4  -10.8    -27.4    -6.4
# 7      -5        0.4       -8.8      1.6    1.2     -8.4    -5.4
# 8       8        8.4       -0.8      0.6    5.2    -10.4     0.6
# 9       9       15.4       21.2     12.6    6.2      6.6    -9.4
# 10      4       -5.6       -5.8     -7.4   -2.8      3.6     0.6
  1. 统计量传入 一个向量
> dat
# rating complaints privileges learning raises critical advance
# 1      43         51         30       39     61       92      45
# 2      63         64         51       54     63       73      47
# 3      71         70         68       69     76       86      48
# 4      61         63         45       47     54       84      35
# 5      81         78         56       66     71       83      47
# 6      43         55         49       44     54       49      34
# 7      58         67         42       56     66       68      35
# 8      71         75         50       55     70       66      41
# 9      72         82         72       67     71       83      31
# 10     67         61         45       47     62       80      41
> sweep(x = dat, MARGIN = 2, STATS = c(11:17), FUN = "-")
# rating complaints privileges learning raises critical advance
# 1      32         39         17       25     46       76      28
# 2      52         52         38       40     48       57      30
# 3      60         58         55       55     61       70      31
# 4      50         51         32       33     39       68      18
# 5      70         66         43       52     56       67      30
# 6      32         43         36       30     39       33      17
# 7      47         55         29       42     51       52      18
# 8      60         63         37       41     55       50      24
# 9      61         70         59       53     56       67      14
# 10     56         49         32       33     47       64      24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值