引用自R語言向量化運(yùn)算之a(chǎn)pply函數(shù)族+split+by:https://blog.csdn.net/qq_38984677/article/details/81676556
apply函數(shù)族包括
apply(),lapply(),sapply(),vapply(),mapply(),rapply(),tapply(),在實(shí)際應(yīng)用中需要依據(jù)不同數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)處理目的采用不同的函數(shù)。
1.apply函數(shù)
apply(x, margin, 指定的函數(shù), ...)
可以將任意一個(gè)函數(shù)應(yīng)用到數(shù)組或矩陣(所有數(shù)據(jù)必須同一類型)的任何維度上,...包含了任何能傳遞到fun的參數(shù),margin=1表示行,margin=2表示列,margin=c(1,2)表示同時(shí)以行和列為單位進(jìn)行計(jì)算,返回向量或矩陣
apply(tian,2,mean,trim=0.2) #計(jì)算每列的截尾均值
2.lapply和sapply函數(shù)
兩個(gè)函數(shù)都可用于處理list\vector\array\matrix\data.frame類型數(shù)據(jù)蛋叼,但lapply()返回list數(shù)據(jù)類型威根,其他方面兩者基本一致
lapply(x,fun,...)
sapply(x,fun,...,simplify=T,USE.NAMES=T)
simplify=T返回向量或矩陣(=F返回list),simplify="array"返回?cái)?shù)組,USE.NAMES確定返回結(jié)果名稱(只對(duì)x是向量時(shí)起作用)
A<-matrix(c(1:9), nrow=3, ncol=3)
B<-matrix(c(4:15), nrow=4, ncol=3)
C<-matrix(rep(seq(8,10),2), nrow=3)
data<-list(A=A, B=B, C=C) #創(chuàng)建數(shù)據(jù)集
lapply(A,sum) #對(duì)矩陣A的每個(gè)值進(jìn)行求和(相當(dāng)于將A轉(zhuǎn)為向量,逐個(gè)求和)
lapply(data, "[", ,2) #提取列表中每一部分第二列的元素
lapply(data, "[", 1,) #提取列表中每一部分第一行的元素
lapply(data, sum) #對(duì)列表每一部分求和
sapply(data, "[", 2, 1) #提取列表每一部分第二行第一列的數(shù),并以向量形式返回
sapply(data, "[", 2, 1, simplify=F)#提取列表每一部分第二行第一列的數(shù),并以列表形式返回
dat_vec <- c('tian', 'shan', 'zhienng')
sapply(dat_vec, nchar)
sapply(dat_vec, nchar, USE.NAMES = F) #不返回名稱
3.vapply函數(shù)
vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE)
X-向量/列表/數(shù)組/數(shù)據(jù)框,FUN.VALUE-設(shè)置行索引,USE.NAMES是否返回名稱
vapply和sapply函數(shù)的區(qū)別在于,前者可控制行名
dat_vec<-c('tian', 'shan', 'zhienng')
#計(jì)算向量中字符串的長度
vapply(dat_vec,nchar,FUN.VALUE=c('a'= 0),USE.NAMES=F) #FUN.VALUE值的length要與函數(shù)返回值的行數(shù)一致(類型也要一致)
4.mapply函數(shù)
mapply(FUN,...,MoreArgs=NULL,SIMPLIFY=TRUE,USE.NAMES=TRUE)
#FUN-自定義函數(shù),...FUN的參數(shù),MoreArgs-函數(shù)的其他參數(shù)列表,SIMPLIFY-自定義返回類型(數(shù)組,矩陣或列表),輸入-vector不限個(gè)數(shù),返回vector或matrix
mapply(rep,1:4,each=2)
mapply(function(x,y) nchar(x)*y,c('wu','xiang','ni'),c(1:3),USE.NAMES=F)
5.tapply函數(shù)
tapply(x,INDEX,FUN=NULL,...,simplify=T)
#x-向量,INDEX-種類(每個(gè)因子需要與x具有相同的長度),返回向量
#構(gòu)建數(shù)據(jù)框-成績統(tǒng)計(jì)
dat_df2<-data.frame(class = sample(1:3,100,replace=T),
gender=sample(c('f','m'),100,replace=T),score=sample(60:95,100,replace=T))
#統(tǒng)計(jì)不同班級(jí)眷细、不同性別的學(xué)生的平均分
tapply(dat_df2$score,INDEX=list(dat_df2$class,dat_df2$gender),mean)
6.rapply函數(shù)
rapply可理解為遞歸版本的lapply隶糕,只處理list類型(對(duì)list中的每一個(gè)元素進(jìn)行遞歸遍歷,如果list元素中還包括子元素需要繼續(xù)遍歷)
rapply(x,FUN,classes=ANY,deflt=NULL,how=c(unlist,replace,list),...)
#x-list對(duì)象,classes-關(guān)于類名的字符向量(any表示任何類型),how-字符串匹配的3種結(jié)果,
deflt-默認(rèn)結(jié)果(不能用于how='replace')
#how='replace':將x-list元素中的值替換為FUN應(yīng)用元素后的結(jié)果,how=list:將x-list元素中符合classes的類替換為FUN應(yīng)用元素后的結(jié)果,其他替換為deflt的值
X <- list(list(a = pi, b = list(c = 1:1)), d = "a test")
rapply(X, function(x) x, how = "replace") #返回自身
rapply(X, sqrt, classes = "numeric", how = "replace")
rapply(X, nchar, classes = "character", deflt = as.integer(NA), how = "list")
rapply(X, nchar, classes = "character", deflt = as.integer(NA), how = "unlist")
rapply(X, nchar, classes = "character", how = "unlist")
rapply(X, nchar, classes = "character", deflt = 2 ,how = "unlist")
rapply(X, log, classes = "numeric", how = "replace", base = 2)
7.eapply函數(shù)
eapply函數(shù)可遍歷R當(dāng)前環(huán)境空間中的每個(gè)變量
eapply(env,FUN,...,all.names=FLASE,USE.NAMES=TRUE)
#env-定義好的R環(huán)境空間,all.names-邏輯值,
是否對(duì)所有值使用函數(shù),USE.NAMES-控制返回值行名,返回list
env<-new.env(hash = FALSE) #定義一個(gè)環(huán)境空間
#向這個(gè)環(huán)境空間中存入3個(gè)變量
env$a<-5:15
env$beta<-exp(3:8)
env$logic<-c(TRUE, FALSE, FALSE, TRUE)
#查看env空間中的變量
ls(env)
[1] "a" "beta" "logic"
ls.str(env)
a : int [1:11] 5 6 7 8 9 10 11 12 13 14 ...
beta : num [1:6] 20.1 54.6 148.4 403.4 1096.6 ...
logic : logi [1:4] TRUE FALSE FALSE TRUE
#對(duì)環(huán)境空間內(nèi)所有對(duì)象遍歷計(jì)算均值
eapply(env, mean)
$logic
[1] 0.5
$beta
[1] 784.0195
$a
[1] 10
8.split函數(shù)
split(x,f)-只形成分組,x是向量或者數(shù)據(jù)框data.frame共耍,f是因子或因子列表,并返回分組列表list
n <- 10; nn <- 100
g <- factor(round(n * runif(n * nn)))
x <- rnorm(n * nn) + sqrt(as.numeric(g))
xg <- split(x, g) #返回11個(gè)list
9.by函數(shù)
by函數(shù)與tapply函數(shù)的運(yùn)作機(jī)制是相同的吨瞎,但by()的應(yīng)用對(duì)象不僅是向量痹兜,也包括矩陣和數(shù)據(jù)框
aba<-read.csv(“abalone.data”,header=TRUE);
by(aba,aba$Gender,function(m) lm(m[,2]~m[,3]));
————————————————
版權(quán)聲明:本文為CSDN博主「扯20080808」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議颤诀,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明字旭。
原文鏈接:https://blog.csdn.net/qq_38984677/article/details/81676556