r語言apply函數用法詳解

一、apply函數的概述

apply函數是R語言中非常常用且強大的函數之一。它可以按行或列執行指定函數,並返回結果向量或矩陣。該函數可以用於數組、矩陣和數據框等對象,是一種通用的數據操作方式。apply()函數通常用於進行聚合分析,也可用於簡化複雜的代碼,提高代碼的可讀性。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

 apply(matrix1, 2, mean)  # 2表示按列進行計算
# [1]  0.4986595  0.7787829  0.8682636  0.8414685  0.5869068

 apply(matrix1, 1, sum)  # 1表示按行進行計算
# [1] 2.866
# [2] 2.055
# [3] 4.127
# [4] 4.462

二、apply函數的參數解析

1. X

X參數表示待操作的對象,如矩陣、數組或數據框等。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 2, sum)  # 將每列的元素相加
# [1] 0.896 3.113 3.472 3.366 2.343

2. MARGIN

MARGIN表示函數操作的維度,是一個整數向量。1表示按行操作,2表示按列操作。默認值為1。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 1, sum)  # 按行相加
# [1] 2.866
# [2] 2.055
# [3] 4.127
# [4] 4.462

apply(matrix1, 2, sum) # 按列相加
# [1] 0.896 3.113 3.472 3.366 2.343

3. FUN

FUN表示應用到數據的函數。可以是內置函數或自定義函數。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 2, function(x) length(unique(x))) # 計算每列獨特元素的數量
# [1] 4 4 4 4 4

4. …

省略號可以傳遞額外的參數給FUN函數,使用時需要將FUN函數設置為可以接受省略號的參數。使用…參數可以動態的傳遞參數。

# 對x矩陣的每一列做二次項的和
x <- matrix(1:12, ncol=3)
apply(x, 2, function(x, a, b) sum(a * x^2 + b), a=1, b=2)
# [1]  38  83 146

三、apply函數的相關函數

1. sapply函數

sapply()函數可應用於向量、列表和矩陣等。在矩陣中,它返回的結果與apply函數相同。與apply不同的是,sapply返回的是一個向量。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

sapply(matrix1, mean)
#[1]  0.4986595  0.7787829  0.8682636  0.8414685  0.5869068

2. lapply函數

lapply()函數可應用於列表、數據框和矩陣等。它返回的是一個列表。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609
list_1 <- as.list(matrix1)

lapply(list_1, function(x) mean(x))
#[[1]] [1] -0.01877
#[[2]] [1] 0.5275837
#[[3]] [1] 0.8317141
#[[4]] [1] 0.8961867
#[[5]] [1] 0.5869068

3. tapply函數

tapply()函數可以對一個向量按指定的因子進行分類操作。它返回的結果是一個數組、矩陣或列表等。

set.seed(123)
age <- c(28, 20, 34, 22, 30, 31, 27, 26, 21, 25, 25, 32)
sex <- factor(c("M", "M", "F", "F", "M", "F", "F", "M", "M", "F", "M", "F"))
salary <- rnorm(12, mean = 2000, sd = 500)
df1 <- data.frame(age, sex, salary)

tapply(df1$salary, df1$sex, mean)
#   F        M 
#1969.675 2236.187 

四、apply函數的注意事項

1. 數據類型和形式必須正確

輸入的數據類型和形式必須符合apply函數的要求。apply()函數不能用於字符型數據或數據框,必須用於向量、數組或矩陣等數據類型。

2. 函數必須是純函數或返回標量值

如果應用的函數有任何可見副作用,則結果可能無法實現。因此,函數的輸出應該是標量值,即單個數字或字符、向量、矩陣或數組。

3. 謹防NA值

apply()函數對於NA值的處理有時可能會使結果出現問題。因此使用該函數時,應注意避免NA值,或使用適當的函數來處理它們。

總結

apply函數是R語言中非常強大、常用的函數之一。通過提供各種選項和參數,可以定製函數操作到各種數據類型。這樣,在進行數據操作時,R語言中的apply()函數可以為您節省大量時間和精力,提高代碼的可讀性和效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/194649.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 14:39
下一篇 2024-12-02 14:39

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29

發表回復

登錄後才能評論