[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規格に従って、
標準に対応する位置に機能を適用します.
ここでapply関数を用いて「NA値を無視し,各行の和&各列の和」を求める.
各値に関数を適用する対象が「ベクトル」(Vector)または「リスト」(List)の場合、使用可能な関数は次のようになります.
📗 lapply
[構造]lapply(X,Fun,...) X:ベクトル/リスト/マトリクス/アレイ(Vector/List/Matrix/Array) FUN:所与の単位の各値に対する関数/演算 ... : このapply関数に適用するオプションパラメータ/we funのproperties値 を入力します.
入力:ベクトル/リスト/行列
出力しゅつりょく:リストりすと
まずは上で使ったデータフレームを簡単に書きます
今回はベクトルやリストを入力したときの結果を見てみましょう.
ベクトルでもリストでも、出力は無条件にlist形式を採用します.
したがって、適用後にベクトルに変換するには、
📘 sapply
[構造]sapply(X,Fun,…,simple=T,USE.NAMES=TRUE) X:リスト/ベクトル(list/vector) FUN:所与の単位の各値に対する関数/演算 ... : このapply関数に適用するオプションパラメータ/we funのproperties値 を入力します.
入力:リスト/ベクトル(vector)
出力:ベクトル/行列
これを補うと、ベクトル/マトリクスの「ユーザーフレンドリー」が返されます.「
lapply関数のパッケージと見なすことができます.
今回もapply関数の例で使用したdataframeを使用します
📘 vapply
[構造]vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE) X:リスト/ベクトル(list/vector) FUN:所与の単位の各値に対する関数/演算 FUN.VALUE: で関数の演算結果を返すデータ型を設定します. ... : このapply関数に適用するオプションパラメータ/we funのproperties値 を入力します.
入力:リスト/ベクトル(vector)
出力:ベクトル/行列
FUN.VALUEパラメータでは、より安全な関数である出力フォーマットが明確に定義されています.
(たまにはもっと早いと言う…!)
この例では、Rに不可欠なirisデータセットを使用します.
ただし、関数はすべての値のターゲットとして適用されます.
列は異なるタイプのデータ、または
各値に適用されない広範囲の関数または出力値を設定すると、機能しません.
📙 mapply
[構造]mapply(Fun,...) FUN:所与の単位の各値に対する関数/演算 ... : この関数に適用されるオプションパラメータ 入力:リスト/ベクトル(vector)
出力:ベクトル/行列
構造的には、関数は第1の側面にあります.
その後、複数の処理オブジェクト(Arguments)を追加して複数の値を記入することができます.
[構造]tapply(X,INDEX,FUN=NULL,...) X:リスト/ベクトル(list/vector) INDEX:パケットの基準として、前のXと同じ数のインデックスが必要です. 入力:リスト/ベクトル&パラメータ(factor/level)
出力:ベクトル/行列
これは関数を適用する方法です.
「要素別処理」ではなく、グループ別処理
この関数はarray(配列)およびmatrix(マトリクス)/dataフレームワークに適用できます.
通常、特定の行(行)または列(列)のデータにコマンドを適用して返します.
通常はfor文が使用されます.
しかし、forkクエリの1つの欠点は、大量のデータを処理する必要がある場合、
すなわち,これには多くの時間と長いコードがかかる.
この点について.
行列またはデータフレーム内の行または列は、演算を1つずつ取り出して実行するための関数と見なすことができる.
まず、最も基礎的なapply関数について説明します.
📕 apply
[structure]apply(X,MARGIN,FUN,…,simple=T)
入力:行列[にゅうりょく:ぎょうれつ]
出力:行列[しゅつりょく:ぎょうれつ]
簡単に言えば、行列や配列に指定された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,...)
入力:ベクトル/リスト/行列
出力しゅつりょく:リストりすと
まずは上で使ったデータフレームを簡単に書きます
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)
入力:リスト/ベクトル(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)
入力:リスト/ベクトル(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,...)
出力:ベクトル/行列
構造的には、関数は第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,...)
出力:ベクトル/行列
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
Reference
この問題について([R]Applyシリーズ関数), 我々は、より多くの情報をここで見つけました https://velog.io/@yummygyudon/R-Apply-계열-함수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol