ViSa
ViSa

Reputation: 2257

How to write if_else condition within a function in r and then apply on all variables of a dataframe?

I am writing a function to find frequency of all elements/levels of a variable if it's character and skip it if it's numeric but getting an error in the condition.

dummy_df <- data.frame(gender_vector = c("Male", "Female", "Female", "Male", "Male"),
                          color_vector = c('blue', 'red', 'green', 'white', 'black'),
                       num_vector = c(1,2,3,4,5)
) 

dummy_df

  gender_vector color_vector num_vector
1          Male         blue          1
2        Female          red          2
3        Female        green          3
4          Male        white          4
5          Male        black          5

code:

Tried:

count_char_cols_fn2 <- function(df,selected_var){
  df %>% 
    if_else(class(.data[[selected_var]]) == "character",
            count(.data[[selected_var]]),
    )
}

purrr::map(df = dummy_df, 
           .x = names(dummy_df),

and

count_char_cols_fn2 <- function(df,selected_var){
  df %>% 
    if_else(class(df$selected_var) == "character",
            count(.data[[selected_var]]),
    )
}

purrr::map(df = dummy_df, 
           .x = names(dummy_df),
           .f = count_char_cols_fn2)

Error in both code attempts:

Error: condition must be a logical vector, not a data.frame object.

where as this works:

class(dummy_df$gender_vector)

[1] "character"

Upvotes: 1

Views: 266

Answers (2)

akrun
akrun

Reputation: 887911

We could do this in dplyr

library(dplyr)
dummy_df %>% 
   summarise(across(where(is.character),  ~ list(table(.))))

Upvotes: 2

Ronak Shah
Ronak Shah

Reputation: 389315

Since you are checking class of one column at a time use if instead of if_else. Also you can use is.character to check if class is of type character.

library(dplyr)
   
count_char_cols_fn2 <- function(df,selected_var){
    if(is.character(df[[selected_var]]))  
      count(df, .data[[selected_var]])
}

purrr::map(names(dummy_df),count_char_cols_fn2, df = dummy_df)

#[[1]]
#  gender_vector n
#1        Female 2
#2          Male 3

#[[2]]
#  color_vector n
#1        black 1
#2         blue 1
#3        green 1
#4          red 1
#5        white 1

#[[3]]
#NULL

Upvotes: 0

Related Questions