Encontre valores absolutos máximos por linha no quadro de dados em R

Jinku Hu 20 novembro 2021
Encontre valores absolutos máximos por linha no quadro de dados em R

Este artigo irá explicar como encontrar valores absolutos máximos por linha em um quadro de dados em R.

Use a função personalizada para encontrar valores absolutos máximos por linha no quadro de dados R

Encontrar valores absolutos máximos em cada linha do quadro de dados e construí-los como um vetor pode ser feito usando a função abs_max que implementamos no trecho de código a seguir. Assumimos que o quadro de dados contém valores numéricos e não numéricos e inicializamos um objeto chamado df1 para fins de verificação. A primeira função chamada no bloco abs_max é Filter. São necessários dois argumentos. O primeiro representa a função unária aplicada a cada elemento do vetor passado como o segundo argumento, e Filter extrai os elementos que avaliam true. Nesse caso, Filter usa a função is.numeric para extrair apenas valores numéricos do quadro de dados.

Em seguida, a função herda é utilizada para verificar se o argumento do abs_max é do tipo tbl_df e, em caso afirmativo, é convertido para um array. Observe que a classe tbl_df é comumente conhecida como tibble e é fornecida com o mesmo nome por um pacote separado, que utilizaremos no próximo exemplo. A função replace é chamada para substituir valores negativos por seu valor absoluto e os tipos NA por -Inf. O próximo, max.col é chamado e extrai o vetor de posições para os valores máximos em cada linha. Finalmente, os valores do resultado são obtidos usando a função cbind. Podemos anexar o último objeto ao quadro de dados existente como uma coluna separada chamada abs_max, conforme demonstrado no exemplo de código a seguir.

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

Resultado:

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

Alternativamente, a mesma função pode ser usada para passar o tipo de objeto tibble e processar suas linhas. Observe que as tabelas serão convertidas em matrizes na função abs_max, mas o resto do código da função funciona da mesma forma que no quadro de dados.

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

Resultado:

# 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - R Data Frame