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
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