• apply函数(对一个数组按行或者按列进行计算):
使用格式为:

apply(X, MARGIN, FUN, ...)

其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。
示例代码:
> ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
> ma
     [,1] [,2] [,3] [,4]
[1,]    1    3    1    7
[2,]    2    4    6    8
> apply(ma, c(1,2), sum)
     [,1] [,2] [,3] [,4]
[1,]    1    3    1    7
[2,]    2    4    6    8
> apply(ma, 1, sum)
[1] 12 20
> apply(ma, 2, sum)
[1]  3  7  7 15

  • 函数tapply(进行分组统计):
使用格式为:

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

其中X通常是一向量;INDEX是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;FUN是需要计算的函数;simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。需要注意的是,当第二个参数INDEX不是因子时,函数 tapply() 同样有效,因为必要时 R 会用 as.factor()把参数强制转换成因子。
示例代码:
> fac <- factor(rep(1:3, length = 17), levels = 1:5)
> fac
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
Levels: 1 2 3 4 5
> tapply(1:17, fac, sum)
 1  2  3  4  5
51 57 45 NA NA
> tapply(1:17, fac, sum, simplify = FALSE)
$`1`
[1] 51

$`2`
[1] 57

$`3`
[1] 45

$`4`
NULL

$`5`
NULL
> tapply(1:17, fac, range)
$`1`
[1]  1 16

$`2`
[1]  2 17

$`3`
[1]  3 15

$`4`
NULL

$`5`
NULL
#利用tapply实现类似于excel里的数据透视表的功能:
> da
   year province sale
1  2007        A    1
2  2007        B    2
3  2007        C    3
4  2007        D    4
5  2008        A    5
6  2008        C    6
7  2008        D    7
8  2009        B    8
9  2009        C    9
10 2009        D   10
> attach(da)
> tapply(sale,list(year,province))
 [1]  1  4  7 10  2  8 11  6  9 12
> tapply(sale,list(year,province),mean)
      A  B C  D
2007  1  2 3  4
2008  5 NA 6  7
2009 NA  8 9 10

  • 函数table(求因子出现的频数):
使用格式为:

table(..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no",
    "ifany", "always"), dnn = list.names(...), deparse.level = 1)

其中参数exclude表示哪些因子不计算。
示例代码:
> d <- factor(rep(c("A","B","C"), 10), levels=c("A","B","C","D","E"))
> d
 [1] A B C A B C A B C A B C A B C A B C A B C A B C A B C A B C
Levels: A B C D E
> table(d)
d
 A  B  C  D  E
10 10 10  0  0
> table(d, exclude="B")
d
 A  C  D  E
10 10  0  0

  • 函数lapply与函数sapply:
lapply的使用格式为:

lapply(X, FUN, ...)

lapply的返回值是和一个和X有相同的长度的list对象,这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中X为List对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。

函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:

sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)
sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list。
示例代码:
> x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
> lapply(x, quantile)
$a
   0%   25%   50%   75%  100%
 1.00  3.25  5.50  7.75 10.00

$beta
         0%         25%         50%         75%        100%
 0.04978707  0.25160736  1.00000000  5.05366896 20.08553692

$logic
  0%  25%  50%  75% 100%
 0.0  0.0  0.5  1.0  1.0

> sapply(x, quantile,simplify=FALSE,use.names=FALSE)
$a
   0%   25%   50%   75%  100%
 1.00  3.25  5.50  7.75 10.00

$beta
         0%         25%         50%         75%        100%
 0.04978707  0.25160736  1.00000000  5.05366896 20.08553692

$logic
  0%  25%  50%  75% 100%
 0.0  0.0  0.5  1.0  1.0
#参数simplify=TRUE的情况
> sapply(x, quantile)
         a        beta logic
0%    1.00  0.04978707   0.0
25%   3.25  0.25160736   0.0
50%   5.50  1.00000000   0.5
75%   7.75  5.05366896   1.0
100% 10.00 20.08553692   1.0

  • 函数mapply:
函数mapply是函数sapply的变形版,mapply 将函数 FUN 依次应用每一个参数的第一个元素、第二个元素、第三个元素上。函数mapply的使用格式如下:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)

其中参数MoreArgs表示函数FUN的参数列表。

示例代码:
> mapply(rep, times=1:4, x=4:1)
[[1]]
[1] 4

[[2]]
[1] 3 3

[[3]]
[1] 2 2 2

[[4]]
[1] 1 1 1 1

#直接使用函数rep的结果:
> rep(1:4,1:4)
 [1] 1 2 2 3 3 3 4 4 4 4

 
 
 
 

1、假定有一组成绩数据,要求根据性别进行分组统计:

> score
    ID   score1 score2 Gender
1  101 11.35321    0.9   male
2  102 12.58654    0.6   male
3  103 19.79380    0.9 female
4  104 12.01352    0.4 female
5  105 11.97081    0.4 female
6  106 17.37480    0.7 female
7  107 14.24884    0.3 female
8  108 18.47972    0.8   male
9  109 18.74792    0.8   male
10 110 18.90146    0.7   male

2、方法:使用aggregate(x, by, FUN)

其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。

> aggregate(score[,c(2,3)],list(score[,4]),mean)
  Group.1   score1 score2
1  female 15.08035   0.54
2    male 16.01377   0.76

score[,c(2,3)] 表示对score1和score2列进行分组统计

list(score[,4])表示根据score第4列,也就是性别列进行分组统计。

mean表示统计平均值。

也可以写作下面的形式:

> aggregate(score[,c(2,3)],list(score$Gender),mean)
  Group.1   score1 score2
1  female 15.08035   0.54
2    male 16.01377   0.76

可选参考:

library(dplyr)

group_by(data, sex) %>% summarize_each(funs(mean), var1, var2, var3...)

R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计的更多相关文章

  1. 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数

        C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁  //站点:www.cn ...

  2. R中的apply族函数和多线程计算

    一.apply族函数 1.apply  应用于矩阵和数组 # apply # 1代表行,2代表列 # create a matrix of 10 rows x 2 columns m <- ma ...

  3. R中利用SQL语言读取数据框(sqldf库的使用)

    熟悉MySQL的朋友可以使用sqldf来操作数据框 # 引入sqldf库(sqldf) library(sqldf) # 释放RMySQL库的加载(针对sqldf报错) #detach("p ...

  4. 深入理解js中的apply、call、bind

    概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...

  5. R中绘制聚类的离散图

    R中利用cluster简单的绘制常见聚类离散图 # 引入cluster库(clara.fanny) library(cluster) # 聚类散点图绘制 # 引入factoextra,cluster库 ...

  6. R中读取EXCEL 数据的方法

    最近初学R语言,在R语言读入EXCEL数据格式文件的问题上遇到了困难,经过在网上搜索解决了这一问题,下面归纳几种方法,供大家分享: 第一:R中读取excel文件中的数据的路径: 假定在您的电脑有一个e ...

  7. R中的高效批量处理函数(lapply sapply apply tapply mapply)(转)

    转自:http://blog.csdn.net/wa2003/article/details/45887055 R语言提供了批量处理函数,可以循环遍历某个集合内的所有或部分元素,以简化操作. 这些函数 ...

  8. R中apply等函数用法[转载]

    转自:https://www.cnblogs.com/nanhao/p/6674063.html 1.apply函数——对矩阵 功能是:Retruns a vector or array or lis ...

  9. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

随机推荐

  1. java多线程学习--java.util.concurrent

    CountDownLatch,api 文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.h ...

  2. nginx实战三

    nginx正向代理 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md Nginx正向代理使用场景并不多见 ...

  3. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...

  4. C#--readlyonly关键字

    字段可以使用readyonly修饰符声明.其作用类似声明一个字段为const,一旦值被设定就不能改变. const字段只能在字段的声明语句中初始化,而readyonly字段可以在下列任何位置设置它的值 ...

  5. MySQL变量的定义与赋值

    MySQL存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

  6. Redis(一):概述

    1.Redis解释 Redis 是一个基于key-value形式进行存储的内存型数据库. 1.1 数据存储方式为key-value 1.2 数据存储在内存中. 1.2.1 优点:效率高.理论值:每秒1 ...

  7. STORM在线业务实践-集群空闲CPU飙高问题排查(转)

    最近将公司的在线业务迁移到Storm集群上,上线后遇到低峰期CPU耗费严重的情况.在解决问题的过程中深入了解了storm的内部实现原理,并且解决了一个storm0.9-0.10版本一直存在的严重bug ...

  8. IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字

    例如下面一段代码 var a = { x: 1, y: 2, }; alert(a.x); 如果在IE的兼容性视图(IE7文档模式)下,会报告下面的错误: SCRIPT1028: 缺少标识符.字符串或 ...

  9. ev3dev:c语言开发lego ev3主机

    有了ev3dev,真是一且皆有可能啊,最近,看到一个好人,居然做了一个ev3的c库. 激动中... 学习有目标了...,赶紧记录一下. https://github.com/theZiz/ev3c

  10. tomcat 源码分析

    Tomcat源码分析——Session管理分析(下)    Tomcat源码分析——Session管理分析(上)     Tomcat源码分析——请求原理分析(下)     Tomcat源码分析——请 ...