M <- matrix(1, ncol=2, nrow = 3)
M # 2x3 矩陣
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
## [3,] 1 1
f1 <- function(x) {
x + c(2,3)
}
apply(M,1,f1) # 2x3 矩陣
## [,1] [,2] [,3]
## [1,] 3 3 3
## [2,] 4 4 4
f2 <- function(x) {
x + c(2,3,4)
}
apply(M,2,f2) # 3x2 矩陣
## [,1] [,2]
## [1,] 3 3
## [2,] 4 4
## [3,] 5 5
#資料是向量
continents <- c("AFRICA","ANTARCTICA","ASIA","EUROPE","NORTH AMERICA","OCEANIA","SOUTH AMERICA")
#nchar 用來計charactor數量 空格也算
lapply(X = continents, FUN = nchar)
## [[1]]
## [1] 6
##
## [[2]]
## [1] 10
##
## [[3]]
## [1] 4
##
## [[4]]
## [1] 6
##
## [[5]]
## [1] 13
##
## [[6]]
## [1] 7
##
## [[7]]
## [1] 13
#解除列表,呈現向量
unlist(lapply(X = continents, FUN = nchar))
## [1] 6 10 4 6 13 7 13
#資料是列表
x <- list(a = 1:6,
b = c(3, 5, 7),
c = c(15:7),
d = c(100, 200)
)
lapply(x,mean)
## $a
## [1] 3.5
##
## $b
## [1] 5
##
## $c
## [1] 11
##
## $d
## [1] 150
#資料是列表矩陣
ml <- list(a = matrix(1,2,2), b = matrix(1:9,3,3))
ml
## $a
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
##
## $b
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
lapply(ml,mean)
## $a
## [1] 1
##
## $b
## [1] 5
X: 列表或矩陣
FUN: 函數
輸出:向量、矩陣、列表
簡化版的lapply()
#矩陣
ms <- list(a = matrix(1,2,2), b = matrix(1:9,3,3),beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
ms
## $a
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
##
## $b
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## $beta
## [1] 0.04978707 0.13533528 0.36787944 1.00000000 2.71828183 7.38905610
## [7] 20.08553692
##
## $logic
## [1] TRUE FALSE FALSE TRUE
sapply(ms,mean,USE.NAMES = TRUE)
## a b beta logic
## 1.000000 5.000000 4.535125 0.500000
與sapply() 相似,可預先指定的返回值類型。
mv <- list(a = matrix(1,2,2), b = matrix(1:9,3,3),beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
vapply(mv, quantile, FUN.VALUE = c(0,0,0,0,0), USE.NAMES = F)
## [,1] [,2] [,3] [,4]
## [1,] 1 1 0.04978707 0.0
## [2,] 1 3 0.25160736 0.0
## [3,] 1 5 1.00000000 0.5
## [4,] 1 7 5.05366896 1.0
## [5,] 1 9 20.08553692 1.0
#可創造函數
funv <- function(x) {return(c(min = min(x), max = max(x)))}
vapply(mv, funv, c(min = 0, max = 0), USE.NAMES = T)
## a b beta logic
## min 1 1 0.04978707 0
## max 1 9 20.08553692 1
#創造向量
a <- c(1, 2, 3, 10, 20, 30, 100, 200, 300)
#創造群組
b <- c("a", "a", "a", "b", "b", "b", "c", "c", "c")
tapply(a, b, mean)
## a b c
## 2 20 200
mapply(sum, 1:5, 1:5, 1:5)
## [1] 3 6 9 12 15
values1 <- list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
values2 <- list(a = c(10, 11, 12), b = c(13, 14, 15), c = c(16, 17, 18))
mapply(function(num1, num2) max(c(num1, num2)), values1, values2)
## a b c
## 12 15 18
mapply(sum, values1)
## a b c
## 6 15 24
mapply(sum, values2)
## a b c
## 33 42 51
mapply(sum, values1,values2)
## a b c
## 39 57 75
#創一個列表
lr <- list(a = list("Toy", "Woody", "Buzz"), b = c(1, 100), c = list(TRUE))
#創一個函數
funr <- function(x) {
if (is.character(x)) { #如果元素是character 加上
return(paste0(x, "!!!"))
}else if(is.numeric(x)){
return(x + 100) #如果元素是numeric, 加100
}else{#如果元素都不是以上的,直接顯示
return(x)
}
}
rapply(lr, funr)
## a1 a2 a3 b1 b2 c
## "Toy!!!" "Woody!!!" "Buzz!!!" "101" "200" "TRUE"
sapply(lr,funr,USE.NAMES = TRUE)
## $a
## $a[[1]]
## [1] "Toy"
##
## $a[[2]]
## [1] "Woody"
##
## $a[[3]]
## [1] "Buzz"
##
##
## $b
## [1] 101 200
##
## $c
## $c[[1]]
## [1] TRUE