You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:12:05