《R語言實戰(zhàn)》自學筆記28-將函數(shù)應用于矩陣和數(shù)據(jù)框

數(shù)據(jù)準備

df <- read.table(file = "D:/Documents/R wd/df.csv", header = T, sep = ",", colClasses = c(year = "character", nitrogen = "character", variety = "character", block = "character")) # 數(shù)據(jù)導入。
df # 查看數(shù)據(jù)。
##    year nitrogen variety block   v1   v2  v3   v4
## 1  2020       N1       a     1 1.26 2.14 3.4 4.66
## 2  2020       N1       a     2 1.20 2.90 4.1 5.30
## 3  2020       N1       a     3 1.30 3.00 4.3 5.60
## 4  2020       N1       b     1 1.08 1.72 2.8 3.88
## 5  2020       N1       b     2 1.05 1.65 2.7 3.75
## 6  2020       N1       b     3 1.15 1.35 2.5 3.65
## 7  2020       N2       a     1 1.32 3.78 5.1 6.42
## 8  2020       N2       a     2 1.28 4.32 5.6 6.88
## 9  2020       N2       a     3 1.35 3.95 5.3 6.65
## 10 2020       N2       b     1 1.33 3.47 4.8 6.13
## 11 2020       N2       b     2 1.28 2.72 4.0 5.28
## 12 2020       N2       b     3 1.30 3.90 5.2 6.50
## 13 2021       N1       a     1 1.19 3.61 4.8 5.99
## 14 2021       N1       a     2 1.21 3.29 4.5 5.71
## 15 2021       N1       a     3 1.24 3.26 4.5 5.74
## 16 2021       N1       b     1 1.09 2.71 3.8 4.89
## 17 2021       N1       b     2 1.28 2.32 3.6 4.88
## 18 2021       N1       b     3 1.35 1.95 3.3 4.65
## 19 2021       N2       a     1 1.45 4.35 5.8 7.25
## 20 2021       N2       a     2 1.40 3.80 5.2 6.60
## 21 2021       N2       a     3 1.37 4.23 5.6 6.97
## 22 2021       N2       b     1 1.28 2.72 4.0 5.28
## 23 2021       N2       b     2 1.15 3.35 4.5 5.65
## 24 2021       N2       b     3 1.24 3.46 4.7 5.94

5.2.6 將函數(shù)應用于矩陣和數(shù)據(jù)框

R函數(shù)的諸多有趣特性之一,就是它們可以應用到一系列的數(shù)據(jù)對象上,包括標量、向量、矩陣、數(shù)組和數(shù)據(jù)框。

a9 <- 9 # 定義標量a9。
sqrt(a9) # 將函數(shù)應用于標量a9。
## [1] 3
a10 <- c(1.325, 2.568, 1.529) # 定義向量a10。
round(a10, 2) # 將函數(shù)應用于向量。
## [1] 1.32 2.57 1.53
a11 <- matrix(runif(18), nrow = 6) # 構(gòu)建矩陣a11,6行3列的矩陣。
log(a11) # log函數(shù)應用于矩陣。
##            [,1]        [,2]       [,3]
## [1,] -0.4238173 -0.04241496 -1.2439280
## [2,] -0.3051322 -4.20768597 -2.3511231
## [3,] -2.5665974 -3.48982964 -3.7582963
## [4,] -0.6209383 -0.13111953 -0.1817037
## [5,] -0.7483455 -1.00996403 -3.2715194
## [6,] -1.2067852 -0.48107681 -1.5293161
mean(a11) # mean函數(shù)應用于矩陣。
## [1] 0.3964861

R中提供了一個apply()函數(shù),可將一個任意函數(shù)“應用”到矩陣、數(shù)組、數(shù)據(jù)框的任何維度上。
apply(x, MARGIN, FUN, ..., simplify = TRUE)
其中,x為數(shù)據(jù)對象,可以是數(shù)組、矩陣、數(shù)據(jù)框,數(shù)據(jù)至少是二維的,MARGIN是維度的下標,MARGIN=1表示行,MARGIN=2表示列。FUN是自定義調(diào)用的函數(shù),可為任意R函數(shù),而...則包括了任何想傳遞給FUN的參數(shù)。
apply函數(shù)只能用于處理矩陣類型的數(shù)據(jù),也就是說所有的數(shù)據(jù)必須是同一類型。因此要使用apply函數(shù)的話,需要將數(shù)據(jù)類型轉(zhuǎn)換成矩陣類型。

a11 # 顯示矩陣a11。
##            [,1]       [,2]       [,3]
## [1,] 0.65454348 0.95847197 0.28824975
## [2,] 0.73702591 0.01488076 0.09526212
## [3,] 0.07679641 0.03050607 0.02332344
## [4,] 0.53743991 0.87711292 0.83384840
## [5,] 0.47314872 0.36423208 0.03794872
## [6,] 0.29915746 0.61811744 0.21668381
apply(a11, 2, sd) # 計算矩陣a11每列的標準差。
## [1] 0.2422482 0.4092547 0.3045456
apply(a11, 1, mean) # 計算矩陣a11每行的平均值。
## [1] 0.63375507 0.28238960 0.04354197 0.74946708 0.29177651 0.37798624
apply(a11, 1:2, function(x) x+1) # 若將MARGIN設(shè)置為1:2,則后面的函數(shù)將對每一個單元格進行操作。
##          [,1]     [,2]     [,3]
## [1,] 1.654543 1.958472 1.288250
## [2,] 1.737026 1.014881 1.095262
## [3,] 1.076796 1.030506 1.023323
## [4,] 1.537440 1.877113 1.833848
## [5,] 1.473149 1.364232 1.037949
## [6,] 1.299157 1.618117 1.216684

lapply(x, FUN)
lapply函數(shù)將函數(shù)應用于輸入變量x的每一個元素,返回一個與x長度相同的列表。x可以是列表,向量或數(shù)據(jù)框。

sapply(x, FUN)
x可以是列表,矩陣或數(shù)據(jù)框,以向量或矩陣形式輸出結(jié)果。執(zhí)行的功能與lapply函數(shù)相同。

tapply(X, INDEX, FUN = NULL)
tapply用于數(shù)據(jù)框類型的數(shù)據(jù),可以按因子變量分組計算統(tǒng)計量。 X可以是數(shù)組、矩陣、數(shù)據(jù)框等分割型數(shù)據(jù)向量,INDEX是一個或多個因子的列表,每個因子的長度都與x相同,F(xiàn)UN為自定義的調(diào)用函數(shù)。53

lapply(df, mean) # 對數(shù)據(jù)框df應用lapply函數(shù)。會對數(shù)據(jù)框有數(shù)據(jù)的列進行函數(shù)應用。
## $year
## [1] NA
## 
## $nitrogen
## [1] NA
## 
## $variety
## [1] NA
## 
## $block
## [1] NA
## 
## $v1
## [1] 1.25625
## 
## $v2
## [1] 3.08125
## 
## $v3
## [1] 4.3375
## 
## $v4
## [1] 5.59375
sapply(df, mean) # 對數(shù)據(jù)框df應用sapply函數(shù)。
##     year nitrogen  variety    block       v1       v2       v3       v4 
##       NA       NA       NA       NA  1.25625  3.08125  4.33750  5.59375
tapply(df$v1, df$year, mean) # 求算df數(shù)據(jù)框v1列的平均值,按照分組year進行計算。
##     2020     2021 
## 1.241667 1.270833

參考資料:

  1. 《R語言實戰(zhàn)》(中文版),人民郵電出版社,2013.
  2. R語言apply族函數(shù)詳解,https://blog.csdn.net/wzgl__wh/article/details/52207233
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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