[R]Applyシリーズ関数


Applyシリーズ関数は、オンデマンドで適用できる機能を持つ関数です.
この関数はarray(配列)およびmatrix(マトリクス)/dataフレームワークに適用できます.
通常、特定の行(行)または列(列)のデータにコマンドを適用して返します.
通常はfor文が使用されます.
しかし、forkクエリの1つの欠点は、大量のデータを処理する必要がある場合、
すなわち,これには多くの時間と長いコードがかかる.
この点について.
行列またはデータフレーム内の行または列は、演算を1つずつ取り出して実行するための関数と見なすことができる.
まず、最も基礎的なapply関数について説明します.
📕 apply
[structure]apply(X,MARGIN,FUN,…,simple=T)
  • X:マトリックス(Array/Matrix)
  • MARGIN:1(動作単位)/2(列単位)
  • FUN:所与の単位の各値に対する関数/演算
  • ... : このapply関数に適用するオプションパラメータ/we funのproperties値
  • を入力します.
    入力:行列[にゅうりょく:ぎょうれつ]
    出力:行列[しゅつりょく:ぎょうれつ]
    簡単に言えば、行列や配列に指定されたMargin規格に従って、
    標準に対応する位置に機能を適用します.
    weight <- c(65.4, 55, 380, 72.2, 51, NA)
    height <- c(170, 155, NA, 173, 161, 166)
    gender <- c("M", "F","M","M","F","F")
    
    df <- data.frame(w=weight, h=height)
    > df
          w   h
    1  65.4 170
    2  55.0 155
    3 380.0  NA
    4  72.2 173
    5  51.0 161
    6    NA 166
    これにより、Data Frameが作成されます.
    ここでapply関数を用いて「NA値を無視し,各行の和&各列の和」を求める.
    apply(df, 1, sum, na.rm=TRUE) # 각 행들의 합 
    [1] 235.4 210.0 380.0 245.2 212.0 166.0
    
    apply(df, 2, sum, na.rm=TRUE) # 각 열들의 합
        w     h 
    623.6 825.0 
    前述したapply()関数の欠点は、マトリクスしか入力できないことです.
    各値に関数を適用する対象が「ベクトル」(Vector)または「リスト」(List)の場合、使用可能な関数は次のようになります.
    📗 lapply
    [構造]lapply(X,Fun,...)
  • X:ベクトル/リスト/マトリクス/アレイ(Vector/List/Matrix/Array)
  • FUN:所与の単位の各値に対する関数/演算
  • ... : このapply関数に適用するオプションパラメータ/we funのproperties値
  • を入力します.
    入力:ベクトル/リスト/行列
    出力しゅつりょく:リストりすと
    まずは上で使ったデータフレームを簡単に書きます
    lapply(df, sum, na.rm=TRUE)
    $w
    [1] 623.6
    
    $h
    [1] 825
    リスト形式で出力され、各カラムが演算されていることがわかります.
    今回はベクトルやリストを入力したときの結果を見てみましょう.
    v<-c("abc", "DEF", "TwT") # 벡터
    l<-list("abc", "DEF", "TwT") # 리스트
    
    [[1]]
    [1] "-abc-"
    
    [[2]]
    [1] "-DEF-"
    
    [[3]]
    [1] "-TwT-"
    これでlapply()関数は名前list+applyで
    ベクトルでもリストでも、出力は無条件にlist形式を採用します.
    したがって、適用後にベクトルに変換するには、unlist()関数を使用する必要があります.
    📘 sapply
    [構造]sapply(X,Fun,…,simple=T,USE.NAMES=TRUE)
  • X:リスト/ベクトル(list/vector)
  • FUN:所与の単位の各値に対する関数/演算
  • ... : このapply関数に適用するオプションパラメータ/we funのproperties値
  • を入力します.
    入力:リスト/ベクトル(vector)
    出力:ベクトル/行列lapply()unlist()関数を用いて解く必要があり、これは煩雑で不便な関数である.
    これを補うと、ベクトル/マトリクスの「ユーザーフレンドリー」が返されます.「
    lapply関数のパッケージと見なすことができます.
    今回もapply関数の例で使用したdataframeを使用します
    sapply(df, sum, na.rm=TRUE)
    
        w     h 
    623.6 825.0 
    その結果、apply()関数では、カラムを標準(MARGIN=2)として処理し、リストではなくベクトル(Vector)として出力することが分かった.
    📘 vapply
    [構造]vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE)
  • X:リスト/ベクトル(list/vector)
  • FUN:所与の単位の各値に対する関数/演算
  • FUN.VALUE:
  • で関数の演算結果を返すデータ型を設定します.
  • ... : このapply関数に適用するオプションパラメータ/we funのproperties値
  • を入力します.
    入力:リスト/ベクトル(vector)
    出力:ベクトル/行列vapply()は、上記のsapply()と同様の関数である.
    FUN.VALUEパラメータでは、より安全な関数である出力フォーマットが明確に定義されています.
    (たまにはもっと早いと言う…!)
    この例では、Rに不可欠なirisデータセットを使用します.
    # 총 다섯개의 열 중 다섯 번째 열은 문자 데이터이기 때문에 함수 적용에 어려움이 있음. -> iris[,1:4]
    # numeric
    a <- vapply(iris[,1:4], function(x) {x > 5}, numeric(length(iris[, 1])))
    head(a)
    
    # 각 값에 함수를 적용한 결과로 5보다 큰 값들만 존재하기 때문에 length()를 적용했을 때, 존재 : 1 / 해당하지 않는 값 : 0 으로 출력된다.
         Sepal.Length Sepal.Width Petal.Length Petal.Width
    [1,]            1           0            0           0
    [2,]            0           0            0           0
    [3,]            0           0            0           0
    [4,]            0           0            0           0
    [5,]            0           0            0           0
    [6,]            1           0            0           0
    
    # 1 : TRUE / 0 : FALSE 인 점을 활용
    b <- vapply(iris[,1:4], function(x) {x > 3}, logical(length(iris[, 1])))
    head(b)
    
    Sepal.Length Sepal.Width Petal.Length Petal.Width
    [1,]         TRUE       FALSE        FALSE       FALSE
    [2,]        FALSE       FALSE        FALSE       FALSE
    [3,]        FALSE       FALSE        FALSE       FALSE
    [4,]        FALSE       FALSE        FALSE       FALSE
    [5,]        FALSE       FALSE        FALSE       FALSE
    [6,]         TRUE       FALSE        FALSE       FALSE
    これは,上記の出力のタイプを決定する安全な関数であると考えられる.
    ただし、関数はすべての値のターゲットとして適用されます.
    列は異なるタイプのデータ、または
    各値に適用されない広範囲の関数または出力値を設定すると、機能しません.
    📙 mapply
    [構造]mapply(Fun,...)
  • FUN:所与の単位の各値に対する関数/演算
  • ... : この関数に適用されるオプションパラメータ
  • 入力:リスト/ベクトル(vector)
    出力:ベクトル/行列
    構造的には、関数は第1の側面にあります.
    その後、複数の処理オブジェクト(Arguments)を追加して複数の値を記入することができます.
    # sprintf : 포맷팅 방식 _ 첫번째 인수 : 적용 문자열 / 이후 : 순서대로 투입될 값들 
    mapply(function(d, s) { sprintf("%d%s", d, s) }, 1:3, c("a", "b", "c"))
    
     [1] "1a" "2b" "3c"
    
    # 연산기호로 함수 적용시킬 수 있음.
    mapply(`+`, 1:10, 101:110)
     [1] 102 104 106 108 110 112 114 116 118 120
    📒 tapply
    [構造]tapply(X,INDEX,FUN=NULL,...)
  • X:リスト/ベクトル(list/vector)
  • INDEX:パケットの基準として、前のXと同じ数のインデックスが必要です.
  • 入力:リスト/ベクトル&パラメータ(factor/level)
    出力:ベクトル/行列tapply()これらの値を特定の基準でグループ化▶扇形、
    これは関数を適用する方法です.
    「要素別処理」ではなく、グループ別処理
    # factor로 쓰일 INDEX
    # M과 F (factor) 
    gender <- c("M", "F","M","M","F","F")
    
    # 1:M 2:F 3:M 4:M 5:F 6:F
    # M -> 1,3,4 / F -> 2,5,6 _factor끼리 함수적용
    tapply(1:6, gender, sum)
    
     F  M 
    13  8
    
    # factor = 1, 2
    # 1:1  1:2  1:3  1:4  1:5  2:6  2:7  2:8  2:9  2:10 
    # 1: 1,2,3,4,5 / 2: 6,7,8,9,10
    tapply(1:10, rep(c(1,2), each=5), sum)
    
     1  2 
    15 40