David Jorquera
David Jorquera

Reputation: 2102

ifelse not doing what it should

I've got an ifelse statement that is not doing what it should. I thought it might have to do with the column type (haven_labelled), but if I try to wrap the replacements in as.numeric the problem persists:

data <- structure(list(ano_encuesta = structure(c(2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2010, 2010), label = "Año de Encuestaje", format.stata = "%12.0g"), 
    region = structure(c(8, 9, 10, 11, 12, 13, 14, 15, 8), label = "Región", format.stata = "%12.0g", labels = c(`Región de Tarapacá` = 1, 
    `Región de Antofagasta` = 2, `Región de Atacama` = 3, `Región de Coquimbo` = 4, 
    `Región de Valparaiso` = 5, `Región del Libertador Gral Bernardo O'higgins` = 6, 
    `Región del Maule` = 7, `Región del Bio Bío` = 8, `Región de La Araucanía` = 9, 
    `Región de los Lagos` = 10, `Región De Aisén del Gral. Carlos Ibañez del Campo` = 11, 
    `Región de Magallanes y Antártica Chilena` = 12, `Región Metropolitana` = 13, 
    `Región de los Ríos` = 14, `Región de Arica y Parinacota` = 15
    ), class = "haven_labelled"), region_2 = structure(c(8, 9, 
    10, 11, 12, 13, 14, 15, 16), label = "RECODE of REGION (Región)", format.stata = "%49.0g", labels = c(`Región de Tarapacá` = 1, 
    `Región de Antofagasta` = 2, `Región de Atacama` = 3, `Región de Coquimbo` = 4, 
    `Región Valparaíso` = 5, `Región del Libertador Gral. Bernardo O'Higgins` = 6, 
    `Región del Maule` = 7, `Región del Biobío` = 8, `Región de La Araucanía` = 9, 
    `Región de Los Lagos` = 10, `Región de Aysén del Gral. Carlos Ibáñez del Campo` = 11, 
    `Región de Magallanes y Antártica Chilena` = 12, `Región Metropolitana` = 13, 
    `Región Los Ríos` = 14, `Región de Arica y Parinacota` = 15, 
    `Región de Ñuble` = 16), class = "haven_labelled")), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

 data %>% mutate(region_aer = ifelse(unique(data $ano_encuesta) %in% 2010:2017, region_2, region))

# A tibble: 9 x 4
  ano_encuesta region     region_2   region_aer
         <dbl> <hvn_lbll> <hvn_lbll>      <dbl>
1         2010  8          8                  8
2         2010  9          9                  8
3         2010 10         10                  8
4         2010 11         11                  8
5         2010 12         12                  8
6         2010 13         13                  8
7         2010 14         14                  8
8         2010 15         15                  8
9         2010  8         16                  8

As you can see, in this case the column region_aer should take the values from the column region_2 since the condition unique(data$ano_encuesta) %in% 2010:2017 evaluates to TRUE.

What is going on?

Some info con my R version:

               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          4                           
minor          0.0                         
year           2020                        
month          04                          
day            24                          
svn rev        78286                       
language       R                           
version.string R version 4.0.0 (2020-04-24)
nickname       Arbor Day 

Upvotes: 0

Views: 97

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388982

ifelse will return output of same length as the test (condition) you are checking. unique(data$ano_encuesta) %in% 2010:2017 returns output of length 1 hence it returns only the 1st value of region_2 which is 8 and it is recycled and applied to all the values in the column.

If you want to check for unique values only use if/else

library(dplyr)

data %>% 
  mutate(region_aer = if(unique(ano_encuesta) %in% 2010:2017) region_2 else region)


#  ano_encuesta                 region               region_2              region_aer
#         <dbl>              <dbl+lbl>              <dbl+lbl>               <dbl+lbl>
#1         2010  8 [Región del Bio Bí…  8 [Región del Biobío]  8 [Región del Biobío] 
#2         2010  9 [Región de La Arau…  9 [Región de La Arau…  9 [Región de La Arauc…
#3         2010 10 [Región de los Lag… 10 [Región de Los Lag… 10 [Región de Los Lago…
#4         2010 11 [Región De Aisén d… 11 [Región de Aysén d… 11 [Región de Aysén de…
#5         2010 12 [Región de Magalla… 12 [Región de Magalla… 12 [Región de Magallan…
#6         2010 13 [Región Metropolit… 13 [Región Metropolit… 13 [Región Metropolita…
#7         2010 14 [Región de los Río… 14 [Región Los Ríos]   14 [Región Los Ríos]   
#8         2010 15 [Región de Arica y… 15 [Región de Arica y… 15 [Región de Arica y …
#9         2010  8 [Región del Bio Bí… 16 [Región de Ñuble]   16 [Región de Ñuble]   

Or use ifelse without unique -

data %>% 
  mutate(region_aer = ifelse(ano_encuesta %in% 2010:2017, region_2 , region))

Upvotes: 4

Related Questions