Найти максимальные абсолютные значения по строке во фрейме данных в R

В этой статье объясняется, как найти максимальные абсолютные значения по строкам во фрейме данных в R.

Использование пользовательской функции для поиска максимальных абсолютных значений по строке в кадре данных R

Найти максимальные абсолютные значения в каждой строке фрейма данных и построить их как вектор можно с помощью функции abs_max, которую мы реализовали в следующем фрагменте кода. Мы предполагаем, что фрейм данных содержит числовые и нечисловые значения, и инициализируем объект с именем df1 для целей проверки. Первая функция, вызываемая в блоке abs_max - Filter. Требуется два аргумента. Первый представляет унарную функцию, применяемую к каждому элементу вектора, переданному в качестве второго аргумента, а Filter извлекает элементы, которые оценивают true. В этом случае Filter использует функцию is.numeric для извлечения только числовых значений из фрейма данных.

Затем функция наследует используется для проверки того, имеет ли аргумент 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 и обработки его строк. Обратите внимание, что таблицы будут преобразованы в матрицы в функции 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

Сопутствующая статья - R Data Frame

  • Объединить два фрейма данных с разным количеством строк в R
  • Создайте большой фрейм данных в R
  • Удалить повторяющиеся строки по столбцу в R