眾所周知,當(dāng)我們利用R語(yǔ)言處理大型數(shù)據(jù)集時(shí),for循環(huán)語(yǔ)句的運(yùn)算效率非常低丸逸。因此在實(shí)際應(yīng)用中锦援,數(shù)據(jù)處理人員常常利用apply族函數(shù)替代for循環(huán)以便于在一定程度上提升R語(yǔ)言數(shù)據(jù)處理速度蝗碎,除此之外湖笨,該方法還可以在一定程度上簡(jiǎn)化代碼。但是蹦骑,我可能已經(jīng)習(xí)慣了for慈省、while的循環(huán)套循環(huán),有時(shí)自己也暈了眠菇,也難怪大佬會(huì)嚴(yán)重鄙視只會(huì)寫(xiě)R的碼農(nóng)(中槍?zhuān)┍枭耄虼诉@節(jié)將介紹apply()
族的函數(shù)。
1. apply()
函數(shù)
apply(X, MARGIN, FUN, ...)
X:數(shù)組琼锋、矩陣放闺、數(shù)據(jù)框
MARGIN: 參數(shù)MARGIN是apply()應(yīng)用的維度,MARGIN=1表示矩陣和數(shù)組的行缕坎,MARGIN=2表示矩陣和數(shù)組的列怖侦,MARGIN=c(1,2)則是對(duì)行和列都進(jìn)行操作。
FUN: 自定義的調(diào)用函數(shù)谜叹,可帶有參數(shù)
apply
函數(shù)可以對(duì)矩陣匾寝、數(shù)據(jù)框、數(shù)組(二維荷腊、多維)艳悔,按行或列進(jìn)行循環(huán)計(jì)算,對(duì)子元素進(jìn)行迭代女仰,并把子元素以參數(shù)傳遞的形式給自定義的FUN函數(shù)中猜年,并以返回計(jì)算結(jié)果。因此可以代替很多for的迭代疾忍。
先來(lái)一個(gè)matrix的例子:
# 建立一個(gè)五行六列的矩陣x
> x <- matrix(rnorm(30), nrow=5, ncol=6)
> print(x)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] -0.281 -0.8657 -0.617 0.0553 -2.007 1.811
[2,] 0.812 -0.0599 -0.262 -1.0007 0.768 -2.550
[3,] -0.208 0.0115 0.912 -0.7582 0.406 1.150
[4,] 1.451 0.2691 1.124 -0.6114 -0.832 1.228
[5,] 0.841 -0.5282 -0.604 -1.3167 0.958 0.152
> dimnames(x)[[1]] <- letters[1:5] #把行的名字改為a~e
> dimnames(x)[[2]] <- letters[1:6] #把列的名字改為a~f
> apply(x, 2, mean, trim = .2) #以列為單位計(jì)算截尾平均值
a b c d e f
0.4820 -0.1922 0.0155 -0.7901 0.1140 0.8434
> col.sums <- apply(x, 2, sum) #以列為單位求和
> col.sums
a b c d e f
2.616 -1.173 0.553 -3.632 -0.707 1.791
> row.sums <- apply(x, 1, sum) #以行為單位求和
> row.sums
a b c d e
-1.905 -2.293 1.514 2.628 -0.497
之后再來(lái)一個(gè)data.frame的例子:
> iris_sum <- apply(iris[,1:4],2,sum)
> iris_sum
Sepal.Length Sepal.Width Petal.Length Petal.Width
876 459 564 180
> iris_mean <- apply(iris[,1:4],2,mean)
> iris_mean
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.84 3.06 3.76 1.20
下面我們引用“優(yōu)雅R”(吹爆大佬G峭狻)的三段代碼,用來(lái)對(duì)比apply()函數(shù)和其他方法的區(qū)別:
> x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
> myFUN<- function(x, c1, c2) {
+ c(sum(x[c1],1), mean(x[c2]))
+ }
> apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 4.0 4 4.0 4 4.0 4 4.0 4
[2,] 3.5 3 2.5 2 2.5 3 3.5 4
> df<-data.frame()
> for(i in 1:nrow(x)){
+ row<-x[i,]
+ df<-rbind(df,rbind(c(sum(row[1],1), mean(row))))
+ }
> df
V1 V2
1 4 3.5
2 4 3.0
3 4 2.5
4 4 2.0
5 4 2.5
6 4 3.0
7 4 3.5
8 4 4.0
> data.frame(x1=x[,1]+1,x2=rowMeans(x))
x1 x2
1 4 3.5
2 4 3.0
3 4 2.5
4 4 2.0
5 4 2.5
6 4 3.0
7 4 3.5
8 4 4.0
上面介紹了三種方法一罩,第一種是用apply函數(shù)按行進(jìn)行循環(huán)計(jì)算杨幼,第二種是用for循環(huán)依次迭代賦值,第三種方法是利用了R的特性聂渊,通過(guò)向量化計(jì)算來(lái)完成的差购,三種方法都可以得出相同的結(jié)果,但是三者對(duì)計(jì)算機(jī)的性能能耗有區(qū)別汉嗽,貼一段比較一下3種操作上面性能上的消耗:
# 清空環(huán)境變量
> rm(list=ls())
# 封裝fun1
> fun1<-function(x){
+ myFUN<- function(x, c1, c2) {
+ c(sum(x[c1],1), mean(x[c2]))
+ }
+ apply(x,1,myFUN,c1='x1',c2=c('x1','x2'))
+ }
# 封裝fun2
> fun2<-function(x){
+ df<-data.frame()
+ for(i in 1:nrow(x)){
+ row<-x[i,]
+ df<-rbind(df,rbind(c(sum(row[1],1), mean(row))))
+ }
+ }
# 封裝fun3
> fun3<-function(x){
+ data.frame(x1=x[,1]+1,x2=rowMeans(x))
+ }
# 生成數(shù)據(jù)集
> x <- cbind(x1=3, x2 = c(400:1, 2:500))
# 分別統(tǒng)計(jì)3種方法的CPU耗時(shí)欲逃。
> system.time(fun1(x))
用戶(hù) 系統(tǒng) 流逝
0.01 0.00 0.02
> system.time(fun2(x))
用戶(hù) 系統(tǒng) 流逝
0.19 0.00 0.18
> system.time(fun3(x))
用戶(hù) 系統(tǒng) 流逝
0 0 0
從CPU的耗時(shí)來(lái)看,用for循環(huán)實(shí)現(xiàn)的計(jì)算是耗時(shí)最長(zhǎng)的诊胞,apply實(shí)現(xiàn)的循環(huán)耗時(shí)很短暖夭,而直接使用R語(yǔ)言?xún)?nèi)置的向量計(jì)算的操作幾乎不耗時(shí)。通過(guò)上面的測(cè)試撵孤,對(duì)同一個(gè)計(jì)算來(lái)說(shuō)迈着,優(yōu)先考慮R語(yǔ)言?xún)?nèi)置的向量計(jì)算,必須要用到循環(huán)時(shí)則使用apply函數(shù)邪码,應(yīng)該盡量避免使用for,while等操作方法裕菠。
2. lapply()
函數(shù)
lapply(X, FUN, ...)
X: 表示列表或者向量
FUN:在行或者列上進(jìn)行運(yùn)算的函數(shù)。
...:運(yùn)算函數(shù)的參數(shù)
lapply
函數(shù)用來(lái)對(duì)list闭专、data.frame數(shù)據(jù)集進(jìn)行循環(huán)奴潘,并返回和X長(zhǎng)度同樣的list結(jié)構(gòu)作為結(jié)果集。apply()
函數(shù)以列表形式返回應(yīng)用函數(shù)的結(jié)果影钉,這是其最顯著特征画髓,需要注意。
# example 1
> lapply(iris[, 1:4], sum)
$Sepal.Length
[1] 876
$Sepal.Width
[1] 459
$Petal.Length
[1] 564
$Petal.Width
[1] 180
> lapply(iris[, 1:4], mean)
$Sepal.Length
[1] 5.84
$Sepal.Width
[1] 3.06
$Petal.Length
[1] 3.76
$Petal.Width
[1] 1.2
# example 2
> 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)
> lapply(data, "[",,2) #提取列表中每一部分第二列的元素
$A
[1] 4 5 6
$B
[1] 8 9 10 11
$C
[1] 8 9 10
> lapply(data, "[", 1,) #提取列表中每一部分第一行的元素
$A
[1] 1 4 7
$B
[1] 4 8 12
$C
[1] 8 8
> lapply(data, sum) #對(duì)列表每一部分求和
$A
[1] 45
$B
[1] 114
$C
[1] 54
lapply
函數(shù)需要注意的有兩點(diǎn):
-
lapply
處理的對(duì)象只能是列表或者是向量平委,他是對(duì)塊進(jìn)行運(yùn)算奈虾,而不是對(duì)列或者行進(jìn)行運(yùn)算,如果要對(duì)數(shù)據(jù)框的行或者列運(yùn)算廉赔,可以將其先轉(zhuǎn)化為列表肉微,若直接計(jì)算:
> x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
> x <- data.frame(x)
> x
x1 x2
1 3 4
2 3 3
3 3 2
4 3 1
5 3 2
6 3 3
7 3 4
8 3 5
> class(x)
[1] "data.frame"
> lapply(x,sum)
$x1
[1] 24
$x2
[1] 24
-
lapply
結(jié)果返回的是list,有時(shí)可能需要將得到的列表再次轉(zhuǎn)為數(shù)據(jù)框蜡塌。轉(zhuǎn)換需要經(jīng)過(guò)如下幾個(gè)階段:
1.使用unlist()函數(shù)碉纳,將列表轉(zhuǎn)換為數(shù)據(jù)框。
2.使用matrix()函數(shù)馏艾,將向量轉(zhuǎn)換為矩陣劳曹。
3.使用as.data.frame()函數(shù),將矩陣轉(zhuǎn)換為數(shù)據(jù)框琅摩。
4.使用names()函數(shù)厚者,從列表獲取變量名,賦給數(shù)據(jù)框的各列迫吐。
3. sapply
函數(shù)
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
X: 表示列表或者向量库菲,與lapply一樣
FUN:在行或者列上進(jìn)行運(yùn)算的函數(shù)。
...:運(yùn)算函數(shù)的參數(shù)
simplify:邏輯值或者字符志膀,用來(lái)確定返回值的類(lèi)型:TRUE表示返回向量或矩陣熙宇;simply = "array"返回?cái)?shù)組
USE.NAMES:確定結(jié)果的名字。
sapply
函數(shù)是一個(gè)簡(jiǎn)化版的lapply
溉浙,lapply
和sapply
函數(shù)可以用于處理列表數(shù)據(jù)和向量數(shù)據(jù)烫止。lapply
函數(shù)得到處理得到的數(shù)據(jù)類(lèi)型是列表,而sapply
函數(shù)得到處理的數(shù)據(jù)類(lèi)型是向量戳稽。這兩個(gè)函數(shù)除了在返回值類(lèi)型不同外馆蠕,其他方面基本完全一樣期升。
> sapply(iris[, 1:4], sum)
Sepal.Length Sepal.Width Petal.Length Petal.Width
876 459 564 180
> sapply(iris[, 1:4], mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.84 3.06 3.76 1.20
> x <- sapply(iris[,1:4],mean)
> class(x)
[1] "numeric"
4. vapply()
函數(shù)
vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
X: 表示列表或者向量
FUN:在行或者列上進(jìn)行運(yùn)算的函數(shù)。
FUN.VALUE:指定返回值的類(lèi)型和名稱(chēng)
USE.NAMES:確定結(jié)果的名字互躬。
vapply函數(shù)類(lèi)似于sapply函數(shù)播赁,其主要區(qū)別為vapply函數(shù)可預(yù)先指定返回值的類(lèi)型和名稱(chēng)。在vapply函數(shù)中總是會(huì)進(jìn)行簡(jiǎn)化吼渡,vapply會(huì)檢測(cè)FUN的所有值是否與FUN.VALUE兼容容为,以使他們具有相同的長(zhǎng)度和類(lèi)型。類(lèi)型順序:邏輯寺酪、整型坎背、實(shí)數(shù)、復(fù)數(shù)寄雀。
# example 1
> x <- data.frame(x)
>
> x<-data.frame(a=rnorm(4,4,4),
+ b=rnorm(4,5,3),
+ c=rnorm(4,5,3))
> x
a b c
1 4.44 6.75 6.73
2 6.86 3.24 2.23
3 5.02 9.34 4.25
4 8.92 6.33 1.33
> vapply(x,mean,c(c=0))
a b c
6.31 6.41 3.64
# example 2
> k<-function(x){
+ list(mean(x),sd(x))
+ }
> vapply(x,k,c(list(c=0,b=0)))
a b c
c 6.31 6.41 3.64
b 2.02 2.5 2.4
example 3
> i39 <- sapply(3:9, seq) # list of vectors
> vapply(i39, fivenum,
+ c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
Min. 1.0 1.0 1 1.0 1.0 1.0 1
1st Qu. 1.5 1.5 2 2.0 2.5 2.5 3
Median 2.0 2.5 3 3.5 4.0 4.5 5
3rd Qu. 2.5 3.5 4 5.0 5.5 6.5 7
Max. 3.0 4.0 5 6.0 7.0 8.0 9
5. tapply函數(shù)
tapply(data, index, FUN = NULL, ..., simplify = TRUE)
data只能是向量
index為因子向量得滤,長(zhǎng)度應(yīng)與data相同。
FUN:分組計(jì)算的函數(shù)盒犹。
...:函數(shù)的額外參數(shù)
Simplify默認(rèn)輸出為向量耿戚,若simplify=FALSE輸出列表。
index向量因子有兩個(gè)形式:1)數(shù)據(jù)框的變量2)指定的分類(lèi)向量阿趁∧せ祝可用c()生成不規(guī)則的因子,也可用gl()生成等長(zhǎng)分類(lèi)的向量脖阵。
tapply用于分組的循環(huán)計(jì)算皂股,通過(guò)INDEX參數(shù)可以把數(shù)據(jù)集X進(jìn)行分組,相當(dāng)于group by的操作命黔。INDEX 一個(gè)或多個(gè)因子的列表呜呐,每個(gè)因子的長(zhǎng)度都與x相同。
# example 1
> daf1<-data.frame(gender=c("M","M","F","M","F","F","M"),
+ age=c(47,59,21,32,40,24,25),
+ salary=c(55000,88000,32450,76500,123000,45650,65000)
+ )
> daf1
gender age salary over40
1 M 47 55000 1
2 M 59 88000 1
3 F 21 32450 0
4 M 32 76500 0
5 F 40 123000 0
6 F 24 45650 0
7 M 25 65000 0
> daf1$over40=ifelse(daf1$age>40,1,0)
> daf1$over40
[1] 1 1 0 0 0 0 0
> tapply(daf1$salary,list(daf1$gender,daf1$over40),mean)
0 1
F 67033 NA
M 70750 71500
# example 2
> df <- data.frame(year=kronecker(2001:2003, rep(1,4)),
+ loc=c('beijing','beijing','shanghai','shanghai'),
+ type=rep(c('A','B'),6),
+ sale=rep(1:12))
> df
year loc type sale
1 2001 beijing A 1
2 2001 beijing B 2
3 2001 shanghai A 3
4 2001 shanghai B 4
5 2002 beijing A 5
6 2002 beijing B 6
7 2002 shanghai A 7
8 2002 shanghai B 8
9 2003 beijing A 9
10 2003 beijing B 10
11 2003 shanghai A 11
12 2003 shanghai B 12
> tapply(df$sale, df[,c('year','loc')], sum)
loc
year beijing shanghai
2001 3 7
2002 11 15
2003 19 23
> tapply(df$sale, df[,c('year','type')], sum)
type
year A B
2001 4 6
2002 12 14
2003 20 22
# example 3
> install.packages("HSAUR2")
trying URL 'https://mirror-hk.koddos.net/CRAN/bin/macosx/el-capitan/contrib/3.6/HSAUR2_1.1-17.tgz'
Content type 'application/x-gzip' length 2804517 bytes (2.7 MB)
==================================================
downloaded 2.7 MB
The downloaded binary packages are in
/var/folders/fl/rylb7v3171970p_spz6sj2hc0000gn/T//RtmpHnOov7/downloaded_packages
> library(tools)
> library(HSAUR2)
> data("CHFLS")
> head(CHFLS)
R_region R_age R_edu R_income R_health R_height R_happy A_height
2 Northeast 54 Senior high school 900 Good 165 Somewhat happy 172
3 Northeast 46 Senior high school 500 Fair 156 Somewhat happy 170
10 Northeast 48 Senior high school 800 Good 163 Somewhat happy 172
11 Northeast 46 Junior high school 300 Fair 164 Somewhat happy 174
22 Northeast 45 Junior high school 300 Fair 162 Somewhat happy 172
23 Northeast 36 Senior high school 500 Excellent 161 Somewhat happy 180
A_edu A_income
2 Senior high school 500
3 Senior high school 800
10 Junior high school 700
11 Elementary school 700
22 Junior high school 400
23 Junior college 900
> str(CHFLS)
'data.frame': 1534 obs. of 10 variables:
$ R_region: Factor w/ 6 levels "Coastal South",..: 5 5 5 5 5 5 5 5 5 5 ...
$ R_age : num 54 46 48 46 45 36 48 36 20 30 ...
$ R_edu : Ord.factor w/ 6 levels "Never attended school"<..: 4 4 4 3 3 4 3 3 3 4 ...
$ R_income: num 900 500 800 300 300 500 0 100 200 400 ...
$ R_health: Ord.factor w/ 5 levels "Poor"<"Not good"<..: 4 3 4 3 3 5 2 4 3 4 ...
$ R_height: num 165 156 163 164 162 161 167 156 158 160 ...
$ R_happy : Ord.factor w/ 4 levels "Very unhappy"<..: 3 3 3 3 3 3 4 2 2 3 ...
$ A_height: num 172 170 172 174 172 180 168 173 178 176 ...
$ A_edu : Ord.factor w/ 6 levels "Never attended school"<..: 4 4 3 2 3 5 3 4 5 4 ...
$ A_income: num 500 800 700 700 400 900 300 800 200 600 ...
> tapply(CHFLS$R_income, CHFLS$R_health, mean)
Poor Not good Fair Good Excellent
338 419 649 645 614
> tapply(CHFLS$R_income, CHFLS$R_edu, mean)
Never attended school Elementary school Junior high school Senior high school
210 416 535 667
Junior college University
1170 1707
6.mapply()函數(shù)
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)
FUN:在行或者列上進(jìn)行運(yùn)算的函數(shù)悍募。
MoreArgs:FUN函數(shù)的其它參數(shù)蘑辑。
simplify:邏輯值或者字符,用來(lái)確定返回值的類(lèi)型坠宴。
USE.NAMES:確定結(jié)果的名字洋魂。
mapply也是sapply的變形函數(shù),類(lèi)似多變量的sapply喜鼓,但是參數(shù)定義有些變化副砍。 mapply()函數(shù)的第一個(gè)參數(shù)是待應(yīng)用的FUN函數(shù),它接受多個(gè)參數(shù)庄岖。要傳遞給FUN()函數(shù)的參數(shù)作為數(shù)據(jù)保存時(shí)豁翎,mapply()函數(shù)將保存在數(shù)據(jù)中的值轉(zhuǎn)換為參數(shù),傳遞給FUN函數(shù)隅忿,并調(diào)用執(zhí)行FUN函數(shù)心剥。
> mapply(rep, 1:4, 4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
> 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
> mapply(rep, times = 1:4, MoreArgs = list(x = 42))
[[1]]
[1] 42
[[2]]
[1] 42 42
[[3]]
[1] 42 42 42
[[4]]
[1] 42 42 42 42
> mapply(function(x, y) seq_len(x) + y,
+ c(a = 1, b = 2, c = 3), # names from first
+ c(A = 10, B = 0, C = -10))
$`a`
[1] 11
$b
[1] 1 2
$c
[1] -9 -8 -7
> word <- function(C, k) paste(rep.int(C, k), collapse = "")
> word
function(C, k) paste(rep.int(C, k), collapse = "")
> utils::str(mapply(word, LETTERS[1:6], 6:1, SIMPLIFY = FALSE))
List of 6
$ A: chr "AAAAAA"
$ B: chr "BBBBB"
$ C: chr "CCCC"
$ D: chr "DDD"
$ E: chr "EE"
$ F: chr "F"
> data("iris")
> mapply(mean,iris[, 1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.843333 3.057333 3.758000 1.199333
> mapply(sum,iris[, 1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9
7. rapply函數(shù)
rapply(object, f, classes = "ANY", deflt = NULL, how = c("unlist", "replace", "list"), ...)
object: list形式;
f: 自定義的調(diào)用函數(shù);
classes : 匹配類(lèi)型, ANY為所有類(lèi)型;
deflt: 非匹配類(lèi)型的默認(rèn)值;
how: 3種操作方式邦尊,當(dāng)為replace
時(shí),則用調(diào)用f后的結(jié)果替換原list中原來(lái)的元素优烧;當(dāng)為list
時(shí)蝉揍,新建一個(gè)list,類(lèi)型匹配調(diào)用f函數(shù)匙隔,不匹配賦值為deflt;當(dāng)為unlist
時(shí)熏版,會(huì)執(zhí)行一次unlist(recursive = TRUE)的操作;
rapply是一個(gè)遞歸版本的lapply纷责,它只處理list類(lèi)型數(shù)據(jù),對(duì)list的每個(gè)元素進(jìn)行遞歸遍歷撼短,如果list包括子元素則繼續(xù)遍歷再膳。
> X <- list(list(a = pi, b = list(c = 1:1)), d = "a test")
> X
[[1]]
[[1]]$a
[1] 3.14
[[1]]$b
[[1]]$b$c
[1] 1
$d
[1] "a test"
> rapply(X, sqrt, classes = "numeric", how = "replace")
[[1]]
[[1]]$a
[1] 1.77
[[1]]$b
[[1]]$b$c
[1] 1
$d
[1] "a test"
> rapply(X, nchar, classes = "character",
+ deflt = as.integer(NA), how = "list")
[[1]]
[[1]]$a
[1] NA
[[1]]$b
[[1]]$b$c
[1] NA
$d
[1] 6
> rapply(X, nchar, classes = "character",
+ deflt = as.integer(NA), how = "unlist")
a b.c d
NA NA 6
> rapply(X, nchar, classes = "character", how = "unlist")
d
6
> rapply(X, log, classes = "numeric", how = "replace", base = 2)
[[1]]
[[1]]$a
[1] 1.65
[[1]]$b
[[1]]$b$c
[1] 1
$d
[1] "a test"
8. eapply函數(shù)
eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE)
env 將被使用的環(huán)境
all.names 邏輯值,指示是否對(duì)所有值使用該函數(shù)
USE.NAMES 邏輯值曲横,指示返回的列表結(jié)果是否包含命名
eapply函數(shù)通過(guò)對(duì)environment中命名值進(jìn)行FUN計(jì)算后返回一個(gè)列表值喂柒,用戶(hù)可以請(qǐng)求所有使用過(guò)的命名對(duì)象。
> require(stats)
> env <- new.env(hash = FALSE)
> env$a <- 1:10
> env$beta <- exp(-3:3)
> utils::ls.str(env)
a : int [1:10] 1 2 3 4 5 6 7 8 9 10
beta : num [1:7] 0.0498 0.1353 0.3679 1 2.7183 ...
> eapply(env, quantile, probs = 1:3/4)
$beta
25% 50% 75%
0.252 1.000 5.054
$a
25% 50% 75%
3.25 5.50 7.75
> eapply(env, quantile)
$beta
0% 25% 50% 75% 100%
0.0498 0.2516 1.0000 5.0537 20.0855
$a
0% 25% 50% 75% 100%
1.00 3.25 5.50 7.75 10.00
本文非原創(chuàng)禾嫉,僅為個(gè)人學(xué)習(xí)筆記總結(jié)灾杰,侵刪。
本文參考以下文獻(xiàn):
apply()族函數(shù)- 土豆R語(yǔ)言與數(shù)據(jù)分析實(shí)戰(zhàn)
apply族函數(shù)應(yīng)用指南
R語(yǔ)言進(jìn)階路上||遇見(jiàn)apply函數(shù)家族
【r<-高級(jí)|理論】apply,lapply,sapply用法探索