主要包括:apply,sapply,lapply,tapply 的簡單用法
apply(X, MARGIN, FUN, …)
X: an array, including a matrix.
MARGIN:是一個維度的編號 for a matrix 1 indicates rows, 2 indicates columns
FUN :the function to be applied
# 首先建立一個test的資料集
data1 <- array(1:50, dim = c(5, 10))
data2 <- matrix(1:50, nrow = 5)
#看一下資料矩陣的樣子
data1
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 6 11 16 21 26 31 36 41 46
## [2,] 2 7 12 17 22 27 32 37 42 47
## [3,] 3 8 13 18 23 28 33 38 43 48
## [4,] 4 9 14 19 24 29 34 39 44 49
## [5,] 5 10 15 20 25 30 35 40 45 50
data2
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 6 11 16 21 26 31 36 41 46
## [2,] 2 7 12 17 22 27 32 37 42 47
## [3,] 3 8 13 18 23 28 33 38 43 48
## [4,] 4 9 14 19 24 29 34 39 44 49
## [5,] 5 10 15 20 25 30 35 40 45 50
# 計算上面資料每一 row 的加總
data1_apply <- apply(data1, 1, sum)
data1_apply
## [1] 235 245 255 265 275
data2_apply<- apply(data2, 1, sum)
data2_apply
## [1] 235 245 255 265 275
# 找出上面資料中,每一列可以被 7 整除的數字有幾個
data3_apply <- apply(data1, 1, function(x) length(x[x %% 7 == 0]))
data3_apply
## [1] 1 2 1 2 1
# 我們也可以用apply對某一屬性進行一定的計算,並添加為新的屬性
# 我們先新建一個 dataframe
data <- data.frame(age = c(15:20),
name = c("a","b","c","d","e","f"),
num = c("1","2","3","4","5","6"),
height = c(157, 172, 168,158,165,170),
weight = c(53, 70, 61,47,55,66))
# 為了試做,計算一個毫無疑義的屬性“test”,就是算出一個人身高和體重的平均數
data$test <- apply(data[c("height","weight")],1,mean)
data
## age name num height weight test
## 1 15 a 1 157 53 105.0
## 2 16 b 2 172 70 121.0
## 3 17 c 3 168 61 114.5
## 4 18 d 4 158 47 102.5
## 5 19 e 5 165 55 110.0
## 6 20 f 6 170 66 118.0
lapply 和 apply 的功能有點類似,都是將運算的公式帶入到輸入檔案的每個元素上,不過在 lapply 當中不能指定要 by row 還是 by column,會逐個項目去運算,所以這裡的資料 X 通常會放一維的 vector,在操作上會比較清楚。
lapply(X, FUN, …)
data_lapply <- lapply(data[c("age","height")],quantile)
data_lapply
## $age
## 0% 25% 50% 75% 100%
## 15.00 16.25 17.50 18.75 20.00
##
## $height
## 0% 25% 50% 75% 100%
## 157.00 159.75 166.50 169.50 172.00
class(data_lapply)
## [1] "list"
sapply 在功能上與 lapply 基本上是一樣的,都是餵給一個 list,然後依據後面指定的功能函數來一項一項做運算, 不過跟 lapply 不同的是,sapply 會回傳一個 vector,而不是 list。
sapply_data <- sapply(data,mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
sapply_data
## age name num height weight test
## 17.50000 NA NA 165.00000 58.66667 111.83333
class(sapply_data)
## [1] "numeric"
tapply ( X, INDEX, FUN = NULL, …, default = NA, simplify = TRUE)
X:需要的向量 (x不可以是數據框),
INDEX:因子或因子列表
FUN:函數
tapply()執行的操作是:按照INDEX對X分組,在分組後的向量上運行函數 FUN
index <- c("3", "4", "3", "2", "3", "4")
data_tapply <- tapply(data$height, index,mean)
data_tapply
## 2 3 4
## 158.0000 163.3333 171.0000