R中如何让函数参数同时作为列名和字符变量使用
解决方案
你可以通过rlang工具集中的符号转换函数处理参数名转字符的需求,同时还可以大幅简化计算逻辑,以下是两种可行的实现方案:
方案1:修改原有函数适配批量调用
首先我们调整函数逻辑,同时支持裸列名、字符类型的列名输入,适配map批量调用的需求:
library(tidyverse) calc_rel_freq <- function(input_color){ # 将输入转为符号,兼容字符和裸列名两种输入形式 col_sym <- rlang::ensym(input_color) # 0/1列的相对频率直接用列求和除以总行数即可,无需分组统计 tibble( color = as.character(col_sym), # 如需保留两位小数和示例输出一致,改为 round(sum(df[[col_sym]]) / nrow(df), 2) 即可 rel_freq = sum(df[[col_sym]]) / nrow(df) ) }
单变量调用测试
calc_rel_freq(blue) #> # A tibble: 1 × 2 #> color rel_freq #> <chr> <dbl> #> 1 blue 0.667
批量调用实现
input_colors <- c("blue", "pink", "black") # 用map_dfr直接合并结果为一个tibble,无需手动拼接 map_dfr(input_colors, calc_rel_freq) #> # A tibble: 3 × 2 #> color rel_freq #> <chr> <dbl> #> 1 blue 0.667 #> 2 pink 0.333 #> 3 black 1
方案2:更简洁的长表转换方案
如果不需要单独封装函数,直接用pivot_longer转换后分组统计,一行代码就能得到最终结果:
df %>% # 把颜色列转为长表 pivot_longer(cols = all_of(input_colors), names_to = "color", values_to = "val") %>% group_by(color) %>% summarise(rel_freq = round(sum(val)/n(), 2)) #> # A tibble: 3 × 2 #> color rel_freq #> <chr> <dbl> #> 1 black 1 #> 2 blue 0.67 #> 3 pink 0.33
内容的提问来源于stack exchange,提问作者Jeremy K.
相关产品推荐
相关产品推荐

