熱線電話:13121318867

登錄
首頁精彩閱讀R語言中的幾類高效函數
R語言中的幾類高效函數
2017-02-21
收藏

R語言中的幾類高效函數

在執行R語言任務時,一個提高執行效率的思路就是盡量避免使用循環語句,否則你的工作將變的緩慢低效。事實上,我們是可以有辦法使用一些較高級的函數來盡量避免使用循環工作的。下面本文將介紹常見的幾種高效函數。

目錄

1.apply函數

2.lapply函數

3.sapply函數

4.tapply函數

5.sweep函數

6.column函數和row函數

1)apply函數

apply函數主要應用在一個數組或者矩陣上,通過給定的函數,并根據指定的計算方向(按行或按列),以該方向的數組為輸入對象,反回計算結果,并將結果存儲于一個數組或向量中。

apply(array, margin, function, ...)

首先定義一個矩陣data

data <- matrix(rep(seq(4), 4), ncol = 4)

data

[,1] [,2] [,3] [,4]

[1,]    1    1    1    1

[2,]    2    2    2    2

[3,]    3    3    3    3

[4,]    4    4    4    4

#先根據行求和,其中1為指定按行計算(1為行,2為列),sum為指定的function

apply(data, 1, sum)

[1]  4  8 12 16

#根據列求和,其中2為按列計算

apply(data, 2, sum)

[1] 10 10 10 10

#使用自定義函數,首先定義函數myfun

myfun <- function(x){

+     sum(x) + 2

+ }

#根據自定義函數,使用apply函數計算

apply(data, 1, myfun)

[1]  6 10 14 18

#自定義函數還可以寫在apply函數內部,不過需要注意,沒有大括號

apply(data, 1, function(x) sum(x) + 2)

[1]  6 10 14 18

#更通用的,可以將函數寫出如下形勢

apply(data, 1, function(x, y) sum(x) + y, y=2)

[1]  6 10 14 18

2)lapply函數

lapply用于對給定的數據,分別對其中的元素按指定的函數計算,并返回一個list。對于數據框來說,lapply函數顯得極為友好,在data.frame中,每個變量可以看做是一個元素,因此lapply應用于data.frame時,可以同時對所有變量按指定函數進行計算。

#首先構造一個數據框

data.df<-data.frame(data)

> data.df

X1 X2 X3 X4

1  1  1  1  1

2  2  2  2  2

3  3  3  3  3

4  4  4  4  4

#對數據框所有變量進行求和,返回每個變量的結果,存儲形式為list。

lapply(data.df, sum)

$X1

[1] 10


$X2

[1] 10


$X3

[1] 10


$X4

[1] 10


#此外,還可以將傳入的函數改成自定義的函數。要注意,函數形式沒有大括號。

y1 <- lapply(data.df, function(x, y) sum(x) + y, y = 5)

y1

$X1

[1] 15


$X2

[1] 15


$X3

[1] 15


$X4

[1] 15

#使用lappy代替循環函數

unlist(lapply(1:5, function(i) print(i) ))

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

[1] 1 2 3 4 5

#對比一下for循環結果就算結果,發現是一致的

for(i in 1:5) print(i)

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

3)sapply函數

sapply函數與lapply函數類似,主要輸入的參數都是數據和函數,但sapply與lapply不同的是sapply返回的是向量,而lapply返回的是一個list。并且sapply還存在第三個參數simplify,當silmplify為FALSE時,那么sapply返回的結果和lapply一致;當silmplify為TRUE時,sapply返回的結果為一個向量或者矩陣;此外還可以設定其它格式。

sapply(list, function, ..., simplify)

y <- sapply(data.df, function(x, y) sum(x) + y, y = 5)

y

X1 X2 X3 X4 

15 15 15 15 

is.vector(y)

[1] TRUE #返回的結果是一個向量

#定義simply=F,此時返回的結果胃list,效果和apply一樣。

y <- sapply(data.df, function(x, y) sum(x) + y, y = 5,simplify = F)

y

$X1

[1] 15


$X2

[1] 15


$X3

[1] 15


$X4

[1] 15


class(y)

[1] "list"

is.list(y)

[1] TRUE#返回結果為list

4)tapply函數

tapply用于對數據進行分組計算,類似于SQL中的group by。tapply需要傳入三個參數,第一個是數據,第二個是數據的分組,第三個參數是指定的計算函數。

data.df<-data.frame(x=runif(10),group1=rep(1:5,2),group2=rep(1:2,5))

data.df

x        group1 group2

1  0.68180046      1      1

2  0.72726914      2      2

3  0.33735976      3      1

4  0.48212394      4      2

5  0.04234556      5      1

6  0.88701919      1      2

7  0.53946995      2      1

8  0.01295496      3      2

9  0.47062069      4      1

10 0.87079649      5      2

tapply(data.df$x, data.df$group1, mean)

1                2                3              4                 5 

0.4926077 0.7726152 0.6058755 0.6110971 0.3074988

#此處還可以傳入兩個分組的計算結果

tapply(data.df$x, list(data.df$group1,data.df$group2), mean)

1                 2          

1 0.68180046 0.88701919

2 0.53946995 0.72726914

3 0.33735976 0.01295496

4 0.47062069 0.48212394

5 0.04234556 0.87079649

5)sweep函數

sweep函數用于對給定的輸入數據做批量的計算,主要參數有數據、統計方向、計算參數、計算函數。其中統計方向可取1或2,取1表示在行的方向上計算,2表示在列的方向上計算。計算函數為加減乘除等算是,默認為減法'-'。

data<-matrix(runif(20),5)

data.df<-data.frame(data)

data.df

X1               X2                X3         X4         

1 0.09248257 0.4358975 0.1884430 0.1212183

2 0.83091974 0.2388490 0.8377123 0.6140257

3 0.15849016 0.2286257 0.8577217 0.9877683

4 0.86437393 0.2771434 0.5302898 0.1608113

5 0.43098913 0.5906199 0.1117341 0.2846628

#將數據按行計算,每行分別減去各行的最大值

sweep(data.df,1,apply(data.df,1,max),'-')

X1         X2         X3         X4

1 -0.343414887  0.0000000 -0.2474544 -0.3146792

2 -0.006792557 -0.5988633  0.0000000 -0.2236865

3 -0.829278179 -0.7591426 -0.1300467  0.0000000

4  0.000000000 -0.5872305 -0.3340842 -0.7035627

5 -0.159630747  0.0000000 -0.4788858 -0.3059571

6)column函數和row函數

還有一些函數也是基于行和列進行統計計算的,如對列進行計算的有colMeans和colSums;對行計算的rowMeans和rowSums。

data.df

X1        X2        X3        X4

1 0.09248257 0.4358975 0.1884430 0.1212183

2 0.83091974 0.2388490 0.8377123 0.6140257

3 0.15849016 0.2286257 0.8577217 0.9877683

4 0.86437393 0.2771434 0.5302898 0.1608113

5 0.43098913 0.5906199 0.1117341 0.2846628

#對列求平均

colMeans(data.df)

X1              X2            X3              X4 

0.4754511 0.3542271 0.5051802 0.4336973

#對列求和

X1              X2       X3            X4 

2.377256 1.771135 2.525901 2.168486

#對行求和

rowSums(data.df)

[1] 0.8380414 2.5215068 2.2326058 1.8326183 1.4180059

#對行求平均

rowMeans(data.df)

[1] 0.2095103 0.6303767 0.5581515 0.4581546 0.3545015


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢