數(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
參考資料:
- 《R語言實戰(zhàn)》(中文版),人民郵電出版社,2013.
- R語言apply族函數(shù)詳解,https://blog.csdn.net/wzgl__wh/article/details/52207233