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
