如何用dplyr编写函数计算指定列的1值占比与均值?
问题解决:基于dplyr编写函数计算列指标
原代码存在几个关键问题:
- 直接依赖全局变量
df,函数复用性差 - 未处理dplyr的非标准求值,列名参数无法被正确识别
- 变量拼写错误(
select1被误写为selected) - 对data.frame直接调用
mean()会报错,需先提取列向量 - 函数仅返回最后一行
paste的结果,无法输出两个指标
修正后的完整代码
library(dplyr) set.seed(1) ch <- sample(LETTERS[1:5], size = 20, replace = TRUE) cls <- sample(c("CLASS ONE", "CLASS TWO"), size = 20, replace = TRUE) var1 <- sample(1:20, size = 20, replace = TRUE) var2 <- sample(20:40, size = 20, replace = TRUE) var3 <- sample(40:60, size = 20, replace = TRUE) var4 <- sample(c(0,1), size = 20, replace = TRUE) df <- data.frame(ch, cls, var1, var2, var3, var4, stringsAsFactors = TRUE) funcA <- function(data, col1, col2) { # 计算目标列中值为1的占比 prop1 <- data %>% summarise(prop = mean({{col1}} == 1) * 100) %>% pull(prop) # 计算目标列的均值 avg <- data %>% summarise(mean_val = mean({{col2}})) %>% pull(mean_val) # 返回合并后的文本结果 c( paste("The percentage of value 1 in", rlang::englue("{{col1}}"), "is: ", round(prop1, 2)), paste("The mean value of", rlang::englue("{{col2}}"), "is: ", round(avg, 2)) ) } # 调用函数 funcA(df, var4, var3)
关键修正说明
- 新增
data参数传入数据集,避免依赖全局变量,提升函数通用性 - 使用
{{}}(整洁评估语法)处理列名参数,让dplyr正确识别传入的列 - 用
summarise结合mean({{col1}} == 1)直接计算占比:逻辑值TRUE会被转为1,FALSE转为0,均值即为占比,简洁高效 - 用
pull()提取summarise结果中的数值,避免data.frame类型导致的计算错误 - 用
c()合并两个文本结果,确保能返回所有指标信息 - 用
round()对结果取两位小数提升可读性,用rlang::englue()获取列名的字符串形式,避免输出固定的"col1""col2"
内容的提问来源于stack exchange,提问作者rez
相关产品推荐
相关产品推荐

