如何在 r 的函数中编写 if_else 条件,然后应用于数据帧的所有变量?

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

我正在写一个 function 来查找一个变量的所有 elements/levels 的 frequency 如果它是 character 并且如果它是 numeric 则跳过它但是越来越条件错误。

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

代码:

尝试过:

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),

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)

两次代码尝试均出错:

错误:condition 必须是逻辑向量,而不是 data.frame 对象。

这在哪里工作:

class(dummy_df$gender_vector)

[1] "character"

由于您一次检查一列的 class,因此请使用 if 而不是 if_else。您也可以使用 is.character 来检查 class 是否属于字符类型。

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

我们可以在 dplyr

中做到这一点
library(dplyr)
dummy_df %>% 
   summarise(across(where(is.character),  ~ list(table(.))))