apply族功能强大,实用,可以代替很多循环语句,先简单介绍apply和tapply函数。 一、apply()函数 apply函数可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。 二、tapply()函数 tapply()函数可根据因子、向量和要计算的函数计算,使用格式如下: tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE) 是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;FUN是需要计算的函数;simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply 返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。 函数 tapply(roster[,"English"], roster[,"grade"], mean) A B 17 25 注:当index不是因子时,可以用as.factor()把参数强制转换成因子
4.tapply() function tapply() 用于对一个vector做一个函数运算 (如:mean, median, min, max, etc..) 。 tapply(X, INDEX, FUN = NULL) Arguments: -X: An object, usually a vector -INDEX: A list containing 参考: https://www.guru99.com/r-apply-sapply-tapply.html#2
#对向量的子集进行操作 #tapply(参数):tapply(向量,因子/因子列表,函数/函数名) > x <- c(rnorm(5),runif(5),rnorm(5,1)) > f <- gl( 3,5) > f [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 Levels: 1 2 3 > tapply(x,f,mean) 1 2 3 -0.5004154 0.4044779 0.9769996 > tapply(x,f,mean,simplify = FALSE) $`1` [1] -0.5004154 $`2` [ 1] 0.4044779 $`3` [1] 0.9769996 > tapply(x,f,sum) 1 2 3 -2.502077 2.022389
Same as lapply but try to simplify the result apply: Apply a function over the margins of an array tapply tapply is used to apply a function over subsets of a vector. I don’t know why it’s called tapply. > str(tapply) function (X, INDEX, FUN = NULL, ..., simplify = TRUE > tapply(x, f, mean, simplify = FALSE) $‘1‘ [1] 0.1144464 $‘2‘ [1] 0.5163468 $‘3‘ [1] 1.246368 Find group ranges. > tapply(x, f, range) $‘1‘ [1] -1.097309 2.694970 $‘2‘ [1] 0.09479023 0.79107293 $‘3‘
交叉分析函数: tapply(统计向量,list(数据透视表中的行,数据透视变中的列),FUN=统计函数) 返回值说明: 一个table类型的统计量 breaks <- c(min(用户明细$年龄 41岁以上'); 年龄分组 <- cut(用户明细$年龄, breaks = breaks, labels = labels) 用户明细[, '年龄分组'] <- 年龄分组 head(用户明细) tapply for example:资产占有率就是一个非常经典的运用 统计占比函数 prop.table(table,margin=NULL) 参数说明: table,使用tapply函数统计得到的分组计数或求和结果 (data$月消费.元., list(data$通信品牌), sum) t prop.table(t); t <- tapply(data$月消费.元., list(data$通信品牌), mean) t prop.table(t); t <- tapply(data$月消费.元., list(data$省份, data$通信品牌), sum) t prop.table(t, margin = 2
04 tapply() 使用的格式: tapply(x,INDEX,FUN,…,simplify=TRUE) x:数据类型是向量 INDEX:因子列表,而且长度和x一样,如果INDEX不是因子,tapply tapply函数可以根据分组进行统计。 ?
R提供了apply系列函数,包括apply,lapply,sapply,tapply,vapply等,可以对二维数据进行计算,并且可以分组进行统计,类似于Excel中的数据透视表功能。 col = 'orange',border = F) abline(h =2) abline(h =4) abline(h =6) abline(h =8) abline(h =c(10,12,14)) tapply (state.x77$Income, state.division, mean) sort(tapply(state.x77$Income, state.division, mean)) sort(tapply (state.x77[size=5][b]数据透视表 [/b][/size] R提供了apply系列函数,包括apply,lapply,sapply,tapply,vapply等,可以对二维数据进行计算 Life Exp`, state.division, mean)) sort(tapply(state.x77$Murder, state.division, mean)) 写在最后:有时间我们会努力更新的
R语言中有几个常用的函数,可以按组对数据进行处理,apply, lapply, sapply, tapply, mapply,等。这几个函数功能有些类似,下面介绍下这几个函数的用法。 Tapply 前面介绍的几个apply函数都是对整体数据进行处理,而tapply是对向量中的数据进行分组处理。 先看看tapply函数的调用格式: tapply(向量数据,分组标识,运算函数,函数的参数,simplify = TRUE) 我们以一个学生数据的Data Frame为例来讲解tapply函数,先构建一个新的学生数据 的方法是: tapply(s$score,s$class,mean) 1 2 92.5 93.5 如果改为按gender算平均成绩,那么就是: tapply(s$score,s$gender 这里就需要把两个向量构建成list作为第二个参数传入: tapply(s$score,list(s$class,s$gender),mean) F M 1 90 95 2 88 99
tapply() 简单地说,tapply()允许我们将数据分组,并对每个分组执行操作。因此,当你提供一个向量作为输入时,tapply()会对向量的每个子集执行指定的操作。 需要的参数包括: tapply(X, INDEX, FUN) 其中INDEX表示要用于分隔数据的因子。听起来耳熟吗? 是的,tapply()只不过是执行groupy操作并对分组数据应用某些函数的简单方法! 来获得每个项目类别的平均数量: tapply(item_qty, item_cat, mean) ? 使用tapply()非常容易,因为它会自动从item_cat 向量 中获取唯一的值,并几乎立即对数据应用所需的函数。
这里可以使用tapply()函数。 tapply()函数用来创建表格(用“t”标识),该表由函数关于第二个参数定义的子组上的返回值构成,其中子组参数可以是一个因子或者一列因子。后一种情形生成一个交叉分类表。 我们采用一个三种类型通风的红细胞叶酸浓度的例子(red.cell.folate): > red.cell.folate > attach(red.cell.folate) > tapply(folate 5 我们可以让他们汇总在一起: > xbar<-tapply(folate,ventilation,mean) > s<-tapply(folate,ventilation,sd) 前一个类似tapply(),只是它对整个数据框操作并且把结果作为一个数据框显示。同时显示多个变量是很有用的。
apply族函数分别有apply函数,tapply函数,lapply函数,mapply函数。每一个函数都有自己的特点,在处理不同类型的数据可以选用相对应的函数。 apply族函数分别有apply函数,tapply函数,lapply函数,mapply函数。每一个函数都有自己的特点,在处理不同类型的数据可以选用相对应的函数。 3.tapply函数 它通常会有三个参数,第一个参数代表数据,第二个参数表示如何对数据进行分组操作,第三个参数指定每一个分组内应用什么函数。 也就是说tapply函数就是把数据按照一定方式分成不同的组,再在每一组数据内进行某种运算。 ? 4.mapply函数 mapply函数主要是对多个列表或者向量参数使用函数. ?
函数名 功能 特点 apply 按行、列运算均值、求和、众数等 简单运算 tapply=table apply 在apply之上加入table功能,可以分组汇总 table结合,可以分组汇总 lapply Apply a Function over a List or Vector对列表或者向量使用函数 vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE) tapply Apply a Function Over a Ragged Array对不规则阵列使用函数 tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE) eapply (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 2、tapply (进行分组统计) tapply
R语言中的分组聚合如果使用矢量函数来进行操作,会大大提升其执行效率: tapply(iris$Sepal.Length,iris$Species,mean) tapply(iris$Sepal.Length tapply(X, INDEX, FUN = NULL, …, simplify = TRUE) tapply是一个快捷的分组聚合函数,其参数简单易懂,通过提供一个度量,一个分类别字段,一个聚合函数即可完成简答的数据聚合功能
因子的常用函数tapply split by tapply tapply(x,f,g)其中,x是向量,f是因子(比如性别,党派),g是函数 要求f中每个因子需要与x有想通的长度。 over under F 12300.00 39050 M 73166.67 NA split 只是形成分组 注意,这点和tapply不同,tapply是将向量分割为组,然后针对每个组应用制定函数 还有一点注意的是split中x可以是数据框,而tapply不可以。 tapply好像很适合,因为分组,应用函数。但是,tapply的第一个参数必须是向量,不能是矩阵或数据框,而回归分析必须至少两列的数据或数据框,其中第一列是被预测的变量,第二列或多列是预测变量。 所以tapply函数不能满足任务。
在实际的工作中,我们总要面对各种各样的数据结构处理,这些操作可以使用循环来完成,但是容易造成内存的占用,以前其实了解过这方面的函数,但是记不清,因此整理下 主要函数如下 apply lapply sapply tapply Sepal.Length [1] 5.843333 $Sepal.Width [1] 3.057333 $Petal.Length [1] 3.758 $Petal.Width [1] 1.199333 tapply 函数 tapply函数一般对数据进行分组描述时使用 tapply(X, INDEX, FUN = NULL) 参数 -X: 一个对象,一般都是向量 -INDEX: 一个包含分类因子的列表 -FUN: 对 X里面每个元素进行操作的函数 示例 data(iris) # 对第一列进行分组求均值 tapply(iris[,1],iris$Species,mean) # 结果 setosa versicolor
//> tdelay : scalaz.concurrent.Task[Int] = scalaz.concurrent.Task@13deb50e 6 val tapply = Task { println("run apply ..."); 3+4 } 7 //> tapply : scalaz.concurrent.Task //> run delay ... 12 //| the result is: 7 13 tapply.unsafePerformAsync tdelay和tapply都是存在trampoline结构里的。但tapply存在更深一层的结构里,所以我们必须拖时间来等待tapply的运算结果。 tdelay存放在Future.Suspend结构里,而tapply是存放在Future.Async结构里的,所以tdelay是一种延迟运算,而tapply就是异步运算了: 1 def delay[A
##### 观测PSI大于0.2的变量##### xx<-tapply(Data$未结清贷款笔数, substr(aa$申请日期,1,7),mean, na.rm = TRUE) write.table (xx, "clipboard", sep = "\t", col.names = FALSE, row.names = TRUE) yy<-tapply(Data$名下物业数量_所有联名人, substr , "overdue60"]==0)/sum(subData1[,"overdue60"]==0) } KS <- max(C_N - C_R) KS # 新版每组坏账 (A/C) tab <- tapply ) write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE) # 新版每组样本量 tab <- tapply write.table(tab, "clipboard", sep = "\t", row.names = FALSE, col.names = FALSE) # 新版每组逾期金额 tab <- tapply
tapply:用于根据某个分组变量对数据进行分组,并对每组数据分别执行函数操作。 list(1, 2, 3, 4, 5) # 使用 sapply 函数计算列表中所有数字的平方和 sapply(x, function(x) x^2) %>% sum [1] 55 例子 4:使用 tapply data.frame( gender = c("M", "F", "M", "F", "M", "F"), height = c(170, 160, 175, 155, 180, 165) ) # 使用 tapply 函数根据性别分组,并求出每组的平均身高 tapply(df$height, df$gender, mean) F M 162.50 176.67 注意,tapply 函数的返回值是一个向量 它们包括 lapply、sapply、apply 和 tapply 函数,每个函数都有各自的用途。使用这些函数可以方便地对数据进行多种操作,提高编程效率。 ❞
4计算各组均值和标准差 mean <- tapply(y$V1,a1,mean) sd <- tapply(y$V1,a1,sd) data <- data.frame(mean,sd) #排序 data $group <- factor(row.names(data), levels = c('模型组','低剂组','高剂组')) 5正态性检验 tapply(y$V1,a1,chisq.test) pairwise.wilcox.test(y$V1,a1,p.adjust.method = "bonferroni") 10使用sink()函数获取结果 sink("calc.txt") print(data) print(tapply
> Y = tapply(base$X,as.factor(base$AM),mean)> Z = ts(as.numeric(Y[1:(146-24)]), start=c(2004,1),frequency 然后,我们可以使用此模型对初始序列进行预测 > Y2=tapply(base$X,as.factor(base$AM),mean) > lines(futur,obs_reel,col="blue 我们可以对原始系列进行预测, > Yp=predict(model3,n.ahead=24) ++ predict(trend,newdata=data.frame(T=futur) > Y2=tapply