apply函數(shù)族+split+by

引用自R語(yǔ)言向量化運(yùn)算之a(chǎn)pply函數(shù)族+split+byhttps://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ù)必須同一類(lèi)型)的任何維度上,...包含了任何能傳遞到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類(lèi)型數(shù)據(jù),但lapply()返回list數(shù)據(jù)類(lèi)型,其他方面兩者基本一致

lapply(x,fun,...)
sapply(x,fun,...,simplify=T,USE.NAMES=T)

simplify=T返回向量或矩陣(=F返回list),simplify="array"返回?cái)?shù)組,USE.NAMES確定返回結(jié)果名稱(chēng)(只對(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)   #不返回名稱(chēng)

3.vapply函數(shù)

vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE)
X-向量/列表/數(shù)組/數(shù)據(jù)框,FUN.VALUE-設(shè)置行索引,USE.NAMES是否返回名稱(chēng)
vapply和sapply函數(shù)的區(qū)別在于,前者可控制行名

dat_vec<-c('tian', 'shan', 'zhienng')
#計(jì)算向量中字符串的長(zhǎng)度
vapply(dat_vec,nchar,FUN.VALUE=c('a'= 0),USE.NAMES=F)   #FUN.VALUE值的length要與函數(shù)返回值的行數(shù)一致(類(lèi)型也要一致)

4.mapply函數(shù)

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

#FUN-自定義函數(shù),...FUN的參數(shù),MoreArgs-函數(shù)的其他參數(shù)列表,SIMPLIFY-自定義返回類(lèi)型(數(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-種類(lèi)(每個(gè)因子需要與x具有相同的長(zhǎng)度),返回向量
#構(gòu)建數(shù)據(jù)框-成績(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類(lèi)型(對(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)于類(lèi)名的字符向量(any表示任何類(lèi)型),how-字符串匹配的3種結(jié)果,
deflt-默認(rèn)結(jié)果(不能用于how='replace')
#how='replace':將x-list元素中的值替換為FUN應(yīng)用元素后的結(jié)果,how=list:將x-list元素中符合classes的類(lèi)替換為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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容