R のデータフレームの行ごとに最大絶対値を求める
この記事では、R のデータフレームの行ごとに最大絶対値を求める方法について説明します。
カスタム関数を使用して、R データフレームの行ごとに最大絶対値を検索する
データフレームの各行で最大絶対値を見つけてそれらをベクトルとして構築するには、次のコードスニペットで実装した abs_max
関数を使用します。データフレームに数値と非数値が含まれていると想定し、検証のために df1
というオブジェクトを初期化します。abs_max
ブロックで呼び出される最初の関数は Filter
です。2つの引数が必要です。1つ目は、2つ目の引数として渡されたベクトルの各要素に適用される単項関数を表し、Filter
は true
を評価する要素を抽出します。この場合、Filter
は is.numeric
関数を使用して、データフレームから数値のみを抽出します。
次に、inherits
関数を使用して、abs_max
の引数が tbl_df
型であるかどうかを確認し、そうである場合は、行列に変換されます。tbl_df
クラスは一般に tibble
と呼ばれ、次の例で使用する別のパッケージによって同じ名前で提供されることに注意してください。replace
関数は、負の値を絶対値に置き換え、NA
タイプを -Inf
に置き換えるために呼び出されます。次に、max.col
が呼び出され、各行の最大値の位置のベクトルが抽出されます。最後に、結果値は cbind
関数を使用して取得されます。次のコードサンプルに示すように、後者のオブジェクトは、abs_max
という名前の個別の列として既存のデータフレームに追加できます。
abs_max <- function(data) {
tmp <- Filter(is.numeric, data)
if(inherits(data, "tbl_df")) {
tmp <- as.matrix(tmp)
}
tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}
df1 <- data.frame(
id = c("foo", "bar", "goo"),
val_a = c(-51, 15, 19),
val_b = c(NA, 122, 35),
val_c = c(10, -23, 4)
)
df1$abs_max = abs_max(df1)
df1
出力:
id val_a val_b val_c abs_max
1 foo -51 NA 10 -51
2 bar 15 122 -23 122
3 goo 19 35 4 35
または、同じ関数を使用して、tibble
オブジェクトタイプを渡し、その行を処理することもできます。tibbles は abs_max
関数で行列に変換されますが、残りの関数コードはデータフレームで行ったのと同じように機能することに注意してください。
library(tibble)
abs_max <- function(data) {
tmp <- Filter(is.numeric, data)
if(inherits(data, "tbl_df")) {
tmp <- as.matrix(tmp)
}
tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}
tb1 <- tibble(
id = c("foo", "bar", "goo"),
val_a = c(-51, 15, 19),
val_b = c(NA, 122, 35),
val_c = c(10, -23, 4)
)
tb1$abs_max = abs_max(tb1)
tb1
出力:
# A tibble: 3 x 5
id val_a val_b val_c abs_max
<chr> <dbl> <dbl> <dbl> <dbl>
1 foo -51 NA 10 -51
2 bar 15 122 -23 122
3 goo 19 35 4 35