R のデータフレームの行ごとに最大絶対値を求める

胡金庫 2022年2月8日
R のデータフレームの行ごとに最大絶対値を求める

この記事では、R のデータフレームの行ごとに最大絶対値を求める方法について説明します。

カスタム関数を使用して、R データフレームの行ごとに最大絶対値を検索する

データフレームの各行で最大絶対値を見つけてそれらをベクトルとして構築するには、次のコードスニペットで実装した abs_max 関数を使用します。データフレームに数値と非数値が含まれていると想定し、検証のために df1 というオブジェクトを初期化します。abs_max ブロックで呼び出される最初の関数は Filter です。2つの引数が必要です。1つ目は、2つ目の引数として渡されたベクトルの各要素に適用される単項関数を表し、Filtertrue を評価する要素を抽出します。この場合、Filteris.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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - R Data Frame