在 R 中的資料幀中按行查詢最大絕對值
Jinku Hu
2021年7月14日
本文將解釋如何在 R 中的資料框中按行查詢最大絕對值。
使用自定義函式在 R 資料框中按行查詢最大絕對值
可以使用我們在以下程式碼片段中實現的 abs_max
函式在資料幀的每一行中查詢最大絕對值並將它們構造為向量。我們假設資料框包含數字和非數字值,並初始化一個名為 df1
的物件以進行驗證。abs_max
塊中呼叫的第一個函式是 Filter
。它需要兩個引數。第一個表示應用於作為第二個引數傳遞的向量的每個元素的一元函式,而 Filter
提取評估 true
的元素。在這種情況下,Filter
採用 is.numeric
函式從資料框中僅提取數值。
然後,inherits
函式用於檢查 abs_max
的引數是否為 tbl_df
型別,如果是,則將其轉換為矩陣。請注意,tbl_df
類通常稱為 tibble
,並由一個單獨的包提供相同的名稱,我們將在下一個示例中使用它。replace
函式被呼叫以用它們的絕對值替換負值,用 -Inf
替換 NA
型別。接下來,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
作者: Jinku Hu