Cálculo de quartis + Coluna condicional

Olá! Essa dúvida foi enviada no curso R para Ciência de Dados I.

Eu estou tentando separar uma base por quartis para ter uma melhor visão dos dados. Eu tenho duas perguntas que seguem abaixo.
1- Estou separando os dados corretamente pelos quartis? Veja por gentileza a coluna “Metodo1” do exemplo.
2- É possível criar uma coluna que terá dois comportamentos distintos para o seu preenchimento? Quando os valores da coluna “Vet” forem iguais ou inferiores a zero a coluna a ser criada será preenchida com “Negativo”. Por outro lado, quando os valores da coluna “Vet” forem superiores a zero gerarão um vetor só de valores positivos que será repartido em quartis, preenchendo essa nova coluna de acordo com a identificação do seu quartil. Em outras palavras essa nova coluna será prenchida com a identificação a quartil aquela linha faz parte se a coluna Vet for maior que zero ou preencherá simplesmente “Negativo”.
Eu fiz algumas tentativas, somente três delas estou trazendo para cá gerando as colunas de nomes “Metodo1”, Metodo2" e “Metodo3”. No arquivo em Excel, a coluna “Resultado esperado” possui justamento o resultado que eu estou buscando e a fiz na mão no excel. A questão aqui é como fazê-la no R programaticamente considerando o acima descrito. A coluna “Vet” possui o vetor que é a base desta tentativa.
Segue o código:

library(magrittr, include.only = "%>%")
library(dplyr)
    Vet <- c(3.32, 2.71, -0.45 ,3.13,2.75, 3.05, -0.2, 7.85, 2.95, -1, 2.88, 2.94, -3.05, 2.88, 2.92, 2.89)
    ola <- data.frame(Vet)
    ola2 <- ola %>% mutate(Metodo01 = case_when(
                            Vet <= quantile (Vet, 0.25) ~ "1ºQ",
                            Vet <= quantile (Vet, 0.50) ~ "2ºQ",
                            Vet <= quantile (Vet, 0.75) ~ "3ºQ",
                            TRUE ~ "4ºQ"
                          ),  
                           Metodo02 = case_when(
                            Vet <= 0 ~"Preju",
                            Vet <= quantile (Vet, 0.25) ~ "1ºQ",
                            Vet <= quantile (Vet, 0.50) ~ "2ºQ",
                            Vet <= quantile (Vet, 0.75) ~ "3ºQ",
                              TRUE ~ "4ºQ"
                         ),
                         Metodo03 = case_when(
    Vet <= 0 ~"Preju",
    Vet <= quantile (Vet > 0, 0.25) ~ "1ºQ",
    Vet <= quantile (Vet > 0, 0.50) ~ "2ºQ",
    Vet <= quantile (Vet > 0, 0.75) ~ "3ºQ",
    TRUE ~ "4ºQ"
                       )
    )

Segue uma planilha eletrônica contendo um quadro comparativo dessas tentativas.

Se a pergunta for a válida para o discourse pode levá-la para lá.

Muito obrigado.

Tabela enviada: https://docs.google.com/spreadsheets/d/1lyMoz-IY4zWvOaxwATP4yXmpy_RApN8ENJj_50U_Kdk/edit?usp=sharing

C., pelo que verifiquei aqui, você utilizou para calcular o “resultado esperado” apenas os valores positivos do vetor "Vet". Mas a função quantile() utiliza o vetor completo. Segui a lógica que você descreveu, e no final do código abaixo, tem uma tibble mostrando duas colunas: usando o vetor completo, e usando apenas os valores positivos do vetor (e aí coincide com a sua classificação em “resultado esperado”).

library(magrittr, include.only = "%>%")
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
Vet <- c(3.32, 2.71, -0.45 ,3.13,2.75, 3.05, -0.2, 7.85, 2.95, -1, 2.88, 2.94, -3.05, 2.88, 2.92, 2.89)
ola <- data.frame(Vet)

# Quartil com vetor completo (16 elementos) --------
quantile(Vet)
#>      0%     25%     50%     75%    100% 
#> -3.0500  1.9825  2.8850  2.9750  7.8500

q1 <- quantile(Vet)[[2]] # primeiro quartil - 25%
q2 <- quantile(Vet)[[3]] # segundo quartil - 50%
q3 <- quantile(Vet)[[4]] # terceiro quartil - 75%

ola2 <- ola %>%
  mutate(quartil_vetor_completo = case_when(
    Vet <= 0 ~ "Negativo",
    Vet > 0 & Vet <= q1 ~ "1ºQ",   
    Vet > q1 & Vet <= q2 ~ "2ºQ", 
    Vet > q2 & Vet <= q3 ~ "3ºQ", 
    Vet > q3  ~ "4ºQ", 
    TRUE ~ "verificar"
  )) %>% 
  arrange(Vet)

# Porém o seu resultado esperado foi calculado 
# usando apenas os elementos positivos

# Quartil dos elementos positivos (12 elementos) --------

Vet_positivo <- Vet[Vet > 0]
Vet_positivo
#>  [1] 3.32 2.71 3.13 2.75 3.05 7.85 2.95 2.88 2.94 2.88 2.92 2.89

# cálculo dos quartis - função quantile()
quantile(Vet_positivo)
#>   0%  25%  50%  75% 100% 
#> 2.71 2.88 2.93 3.07 7.85

q1_p <- quantile(Vet_positivo)[[2]] # primeiro quartil - 25%
q2_p <- quantile(Vet_positivo)[[3]] # segundo quartil - 50%
q3_p <- quantile(Vet_positivo)[[4]] # terceiro quartil - 75%



ola3 <- ola2 %>%
  mutate(quartil_valores_positivos = case_when(
    Vet <= 0 ~ "Negativo",
    Vet > 0 & Vet <= q1_p ~ "1ºQ",   
    Vet > q1_p & Vet <= q2_p ~ "2ºQ", 
    Vet > q2_p & Vet <= q3_p ~ "3ºQ", 
    Vet > q3_p  ~ "4ºQ", 
    TRUE ~ "verificar"
  )) %>% 
  arrange(Vet)

as_tibble(ola3)
#> # A tibble: 16 x 3
#>      Vet quartil_vetor_completo quartil_valores_positivos
#>    <dbl> <chr>                  <chr>                    
#>  1 -3.05 Negativo               Negativo                 
#>  2 -1    Negativo               Negativo                 
#>  3 -0.45 Negativo               Negativo                 
#>  4 -0.2  Negativo               Negativo                 
#>  5  2.71 2ºQ                    1ºQ                      
#>  6  2.75 2ºQ                    1ºQ                      
#>  7  2.88 2ºQ                    1ºQ                      
#>  8  2.88 2ºQ                    1ºQ                      
#>  9  2.89 3ºQ                    2ºQ                      
#> 10  2.92 3ºQ                    2ºQ                      
#> 11  2.94 3ºQ                    3ºQ                      
#> 12  2.95 3ºQ                    3ºQ                      
#> 13  3.05 4ºQ                    3ºQ                      
#> 14  3.13 4ºQ                    4ºQ                      
#> 15  3.32 4ºQ                    4ºQ                      
#> 16  7.85 4ºQ                    4ºQ

Created on 2021-03-16 by the reprex package (v1.0.0)

Resposta do William:

O método 2 está próximo do que você gostaria. O problema é que calcular o quantile de Vet também vai considerar os valores negativos. Você tentou corrigir isso no método 3, mas Vet > 0 é um vetor de TRUE e FALSE. O que você quer é: quantile(Vet[Vet > 0], 0.25), isto é, selecionar da coluna Vet apenas os valores positivos.