zoukankan      html  css  js  c++  java
  • R中利用apply、tapply、lapply、sapply、mapply、table等函数进行分组统计

    • 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...)
  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6485120.html
Copyright © 2011-2022 走看看