85.关于tapply函数

【上一篇:84.关于apply族的lapply/sapply/vapply】
【下一篇:86.关于split函数】

tapply函数

    Apply a Function Over a Ragged Array
    在ragged array上应用函数。将一个函数应用到一个ragged array的每个单元,每个单元是一个或多个与ragged array等长的因子决定的,比如给定一个因子,因子有多少个level,则ragged array就会被分成几个group,函数将应用到每个group上。简言之,tapply函数相当于group_by分组计算。[ragged array是什么?vector?]

tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)
输入参数详解

    X:一个可以应用split方法的R对象。这个R对象通常是vector-like,可以用"["方法取子集。
    INDEX:一个list,包含一个或多个与X等长的factor。若list的元素不是factor,则会被强制用as.factor()。若INDEX仅包含一个因子时,tapply返回一个一维数组;若INDEX包含两个因子,tapply返回一个二维数组,第一个因子中levels的个数等于第一维度的长度,第二个因子中levels的个数等于第二维度的长度;依次类推。
    FUN:应用到X的每个group上的函数,可以为NULL。若为NULL,则tapply()将返回一个向量,该向量包含tapply正常产生的数组的下标。
    ...:传递给FUN的参数。
    default:默认值是NA,即用来初始化数组的值是NA(仅当simplify为array的时候有效)。你可以设置为任何的值,但你设置的值的类型会最终影响数组的中元素的类型。
    simplify:默认为TURE,返回简化后的数组。若为FALSE,返回值也是数组,数组元素的类型是List。

输出说明

    1)simplify=FALSE时,返回值是数组,数组元素的type始终是List,缺失值用NULL表示
    2)simplify=TRUE时,返回值是简化后的数组。所谓简化,仅当FUN函数的返回值为长度为1的向量时与simplify=TRUE是有明显差别,其他时候,simplify=TRUE对结果基本无作用。当FUN的返回值为长度为1的向量时,简化后数组元素的type将与FUN返回值的type一致。
    3)tapply函数的返回值始终是array,array的维度等于length(INDEX)。若INDEX仅包含一个因子,tapply将返回一个一维数组,一维数组的长度等于因子中levels的数量;若INDEX包含两个因子,tapply将返回一个二维数组,二维数组的第一维度的长度等于INDEX第一个因子的levels的数目,第二个维度的长度等于INDEX第二个因子的levels的数目;INDEX因子个数大于2是,依次类推。

举例说明

    1)INDEX为一个因子,返回一维数组,一维数组长度等于该因子的levels的个数;simplify=FALSE时,数组元素的type始终是list;FUN函数的返回值为长度为1的向量(类似函数有sum、mean、var等)且simplify=TRUE时,数组元素的type与FUN函数的返回值的type一致。

# INDEX为一个因子,函数返回一个一维数组,不简化时,数组元素类型是list
> (test0<- tapply(1:10,rep(c("a","b"),5),sum,simplify = F))
$a
[1] 25
$b
[1] 30
# 一维数组:INDEX=list(as.factor(rep(c("a","b"),5))),length(INDEX)=1
# 一维数组长度:nlevels(as.factor(rep(c("a","b"),5)))
> dim(test0)
[1] 2
> class(test0)
[1] "array"
> class(test0[1])
[1] "list"
# 简化时,返回结果仍然是一维数组,但数组元素的类型与sum函数的返回值的类型一致
> (test1<- tapply(1:10,rep(c("a","b"),5),sum,simplify = T))
 a  b 
25 30 
> dim(test1)
[1] 2
> class(test1)
[1] "array"
> class(test1[0])
[1] "integer"

    2)INDEX包含两个因子,返回二维数组,二维数组的第一个维度的长度等于INDEX第一个因子的levels的数量,第二个维度等于INDEX第二个因子的levels的数量。

> ind <- list(c(1, 2, 2), c("A", "A", "B"))
# 不简化时,缺失值用NULL表示
> (test2<-tapply(1:3, ind, sum,simplify = F))
  A B   
1 1 NULL
2 2 3   
> dim(test2)
[1] 2 2
> class(test2)
[1] "matrix" "array" 
# 不简化时,数组元素为List
> class(test2[0])
[1] "list"
# 简化时,缺失值默认为NA,可以通过设置default改变
> (test3<-tapply(1:3, ind, sum,simplify = T))
  A  B
1 1 NA
2 2  3
> dim(test3)
[1] 2 2
> class(test3)
[1] "matrix" "array" 
# sum函数的返回值长度为1,简化后,数组元素类型不再是list
> class(test3[0])
[1] "integer"

    3)当FUN函数的返回值长度>1,simplif对返回的结果基本无作用。FUN返回值长度为1,缺失值默认用NA表示(当然,可以通过设置default参数改变,例子见上文),长度>1,缺失值仍然是NULL。

# FUN函数的返回值长度>1
> (test4<-tapply(1:3, ind, quantile,simplify = F))
  A         B        
1 numeric,5 NULL     
2 numeric,5 numeric,5
> class(test4[1])
[1] "list"
> test4[1]
[[1]]
  0%  25%  50%  75% 100% 
   1    1    1    1    1
# FUN返回结果长度>1,即使简化,结果也无变化
> (test5<-tapply(1:3, ind, quantile,simplify = T))
  A         B        
1 numeric,5 NULL     
2 numeric,5 numeric,5
> class(test5)
[1] "matrix" "array" 
> class(test5[1])
[1] "list"
> test5[1]
[[1]]
  0%  25%  50%  75% 100% 
   1    1    1    1    1 

    4)tapply函数在数据框中的重要应用:分组求和生成列联表形式的求和结果。

> head(warpbreaks)
  breaks wool tension
1     26    A       L
2     30    A       L
3     54    A       L
4     25    A       L
5     70    A       L
6     52    A       L
> tapply(warpbreaks$breaks, warpbreaks[,-1], sum)
    tension
wool   L   M   H
   A 401 216 221
   B 254 259 169
> tapply(warpbreaks$breaks, warpbreaks[, 3, drop = FALSE], sum)
tension
  L   M   H 
655 475 390 

【上一篇:84.关于apply族的lapply/sapply/vapply】
【下一篇:86.关于split函数】

你可能感兴趣的:(85.关于tapply函数)