R apply 家族

主要包括:apply,sapply,lapply,tapply 的簡單用法

apply() 的用法

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() 的用法

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(X, FUN, …)

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( )

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