在 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