Uso do ifelse em contextos diferentes

Olá! Tudo bem com vocês? Espero que sim.

Eu tenho uma dúvida em R. Considere o seguinte df:

df_1 <- data.frame(
  x = c(0, 1, 0, 2, 0), 
  y = c(0, 2, 1, 2, 1), 
  z = c(0, 2, 1, 2, 1)
)

Considere a função abaixo:

lapply(X = df_1, FUN = sum, na.rm = TRUE)

#$x
#[1] 3

#$y
#[1] 6

#$z
#[1] 6

Ela funciona. Considere esta função agora:

lapply(X = df_1, FUN = function(x) {
  ifelse(test = x >= 1, yes = 'OK', no = 'NO_OK')
})

#$x
#[1] "NO_OK" "OK"    "NO_OK" "OK"    "NO_OK"

#$y
#[1] "NO_OK" "OK"    "OK"    "OK"    "OK"   

#$z
#[1] "NO_OK" "OK"    "OK"    "OK"    "OK"

Tudo bem também. Mas, eu gostaria de saber como ajustar esta segunda função (com ifelse) com a estrutura da primeira função (com sum). Algo como:

lapply(X = df_1, FUN = ifelse, df_1 >= 1, yes = 'OK', no = 'NO_OK')

Se não tiver como, qual é a explicação teórica para isso?

Ainda sobre o uso de ifelse, considere o código abaixo:

library(purrr)
library(dplyr)

df_1 %>%
  mutate(var = pmap_chr(., lift_vd(function(x) if_else(n_distinct(x) == 1, "ok", "nok"))))

    #   x y z var
    #1 0 0 0  ok
    #2 1 2 2 nok
    #3 0 1 1 nok
    #4 2 2 2  ok
    #5 0 1 1 nok

Funciona. Mas, com uso do operador ~ na frente de if_else não:

df_1 %>%
  mutate(var = pmap_chr(., lift_vd(~ if_else(n_distinct(.) == 1, "ok", "nok"))))

Mas o ~ não seria um substituto para function(x) {if_else(...)}? O que ocorre neste caso?

Obrigado pela atenção.

1 Curtida

O problema para a primeira pergunta é que o lapply passa cada elemento da lista (o data frame é uma lista, cada coluna um elemento) como primeiro argumento da função FUN, no seu caso, você o seu primeiro argumento é x > 1 e não somente x. Por isso a gente cria uma função anônima para poder modificar o input.

Você poderia fazer algo assim, mas eu não recomendo muito:

df_1 %>% 
  lapply(FUN = `>`, 1) %>% 
  lapply(FUN = ifelse, yes = "OK", no = "NOT_OK")

Para a segunda pergunta, me parece que o problema é que a lift_* não suporta funções lambda escritas dessa maneira. Por exemplo se você fizer com as_function (a função do rlang que sabe transformar lambdas em funções, funciona:

df_1 %>%
  mutate(var = pmap_chr(., lift_vd(rlang::as_function(~if_else(n_distinct(.x) == 1, "ok", "nok")))))
1 Curtida