Reputation: 2257
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
Reputation: 887911
We could do this in dplyr
library(dplyr)
dummy_df %>%
summarise(across(where(is.character), ~ list(table(.))))
Upvotes: 2
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